#include <iostream> #include <vector> #include <string> #include <set> #include <algorithm> using namespace std; const int ENG = 26; int getind(char c) { return c - 'a'; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; vector<string> s(n); for (int i = 0; i < n; i++) { cin >> s[i]; reverse(s[i].begin(), s[i].end()); } string t; cin >> t; reverse(t.begin(), t.end()); string ans = ""; vector<vector<int>> cur(ENG); int totlen = 0; for (int i = 0; i < n; i++) { cur[getind(s[i].back())].push_back(i); totlen += s[i].size(); } while (totlen > 0) { for (int i = 0; i < ENG; i++) { if (i == getind(t.back())) continue; while (!cur[i].empty()) { int cursi = cur[i].back(); cur[i].pop_back(); while (!s[cursi].empty() && s[cursi].back() != t.back()) { ans += s[cursi].back(); s[cursi].pop_back(); totlen--; } if (!s[cursi].empty()) { cur[getind(s[cursi].back())].push_back(cursi); } } } if (totlen == 0) break; ans += t.back(); vector<int> cursis = cur[getind(t.back())]; cur[getind(t.back())].clear(); for (int& si : cursis) { s[si].pop_back(); totlen--; if (!s[si].empty()) { cur[getind(s[si].back())].push_back(si); } } t.pop_back(); if (t.empty()) { cout << "NO" << endl; return 0; } } cout << "YES" << endl; cout << ans << endl; return 0; }