#include <bits/stdc++.h> using namespace std; #define fwd(i, a, n) for(int i = (a); i < (n); i++) #define rep(i, n) fwd(i, 0, n) #define all(X) X.begin(), X.end() #define sz(X) int(size(X)) #define pb push_back #define eb emplace_back #define st first #define nd second using pii = pair<int, int>; using vi = vector<int>; using ll = long long; using ld = long double; #ifdef LOC auto SS = signal(6, [](int) {* (int *) 0 = 0;}); #define DTP(x, y) auto operator << (auto& o, auto a) -> decltype(y, o) {o << "("; x; return o << ")";} DTP(o << a.st << ", " << a.nd, a.nd); DTP(for(auto i : a) o << i << ", ", all(a)); void dump(auto... x) {((cerr << x << ", "), ...) << "\n";} #define deb(x...) cerr << setw(4) << __LINE__ << ":[" #x "]: ", dump(x) #else #define deb(...) 0 #endif int32_t main(){ cin.tie(0)->sync_with_stdio(0); cout << fixed << setprecision(10); int n = 0; cin >> n; vector<string> words(n); rep(i, n) cin >> words[i]; string banned, ans; cin >> banned; vi ids(n); vector<vi> nxt(26); rep(i, n) nxt[words[i][0] - 'a'].pb(i); int finished = 0; rep(idban, sz(banned)) { int k = 1; while (k) { k = 0; rep(letter, sz(nxt)) { if (letter != banned[idban]-'a' && sz(nxt[letter])) { int i = nxt[letter].back(); nxt[letter].pop_back(); ans.pb(letter + 'a'); ++ids[i]; k = 1; if (ids[i] < sz(words[i])) { nxt[words[i][ids[i]] - 'a'].pb(i); } else { ++finished; } } } deb(k, idban, ans, ids, nxt); } deb(idban, ans, ids, nxt); if (finished == n) { cout << "YES\n" << ans << '\n'; return 0; } if (idban == sz(banned) - 1) { cout << "NO\n"; return 0; } vi kto = nxt[banned[idban]-'a']; nxt[banned[idban]-'a'].clear(); ans.pb(banned[idban]); for (int i : kto) { ++ids[i]; if (ids[i] < sz(words[i])) { nxt[words[i][ids[i]] - 'a'].pb(i); } else { ++finished; } } deb(idban, ans, ids, nxt); } return 0; }