#include <bits/stdc++.h>
using namespace std;
using namespace std::chrono;
int fx[] = {-1, 1, 0, 0};
int fy[] = {0, 0, 1, -1};
int bx[] = {-1, 1, 0, 0, 1, 1, -1, -1};
int by[] = {0, 0, 1, -1, 1, -1, -1, 1};
int cx[] = {1, 1, 2, 2, -1, -1, -2, -2};
int cy[] = {2, -2, 1, -1, 2, -2, 1, -1};
void __print(int x) { cerr << x; }
void __print(long x) { cerr << x; }
void __print(long long x) { cerr << x; }
void __print(unsigned x) { cerr << x; }
void __print(unsigned long x) { cerr << x; }
void __print(unsigned long long x) { cerr << x; }
void __print(float x) { cerr << x; }
void __print(double x) { cerr << x; }
void __print(long double x) { cerr << x; }
void __print(char x) { cerr << '\'' << x << '\''; }
void __print(const char *x) { cerr << '\"' << x << '\"'; }
void __print(const string &x) { cerr << '\"' << x << '\"'; }
void __print(bool x) { cerr << (x ? "true" : "false"); }
template <typename T, typename V>
void __print(const pair<T, V> &x) {
  cerr << '{';
  __print(x.first);
  cerr << ',';
  __print(x.second);
  cerr << '}';
}
template <typename T>
void __print(const T &x) {
  int f = 0;
  cerr << '{';
  for (auto &i : x) cerr << (f++ ? "," : ""), __print(i);
  cerr << "}";
}
void _print() { cerr << "]\n"; }
template <typename T, typename... V>
void _print(T t, V... v) {
  __print(t);
  if (sizeof...(v)) cerr << ", ";
  _print(v...);
}
string decToBin(int n) {
  string s = bitset<64>(n).to_string();
  const auto loc1 = s.find('1');
  if (loc1 != string::npos) return s.substr(loc1);
  return "0";
}
int bin_to_dec(char s[]) { return stoi(s, 0, 2); }
const int N = 2e5 + 5;
struct DirectedEulerPath {
  int n;
  vector<vector<int>> g;
  vector<int> path;
  void init(int _n) {
    n = _n;
    g = vector<vector<int>>(n + 1, vector<int>());
    path.clear();
  }
  void add_edge(int u, int v) { g[u].push_back(v); }
  void dfs(int u) {
    while (g[u].size()) {
      int v = g[u].back();
      g[u].pop_back();
      dfs(v);
    }
    path.push_back(u);
  }
  bool getPath() {
    int ctEdges = 0;
    vector<int> outDeg, inDeg;
    outDeg = inDeg = vector<int>(n + 1, 0);
    for (int i = 1; i <= n; i++) {
      ctEdges += g[i].size();
      outDeg[i] += g[i].size();
      for (auto &u : g[i]) inDeg[u]++;
    }
    int ctMiddle = 0, src = 1;
    for (int i = 1; i <= n; i++) {
      if (abs(inDeg[i] - outDeg[i]) > 1) return 0;
      if (inDeg[i] == outDeg[i]) ctMiddle++;
      if (outDeg[i] > inDeg[i]) src = i;
    }
    if (ctMiddle != n && ctMiddle + 2 != n) return 0;
    dfs(src);
    reverse(path.begin(), path.end());
    return (path.size() == ctEdges + 1);
  }
};
int n, k;
string rev[N];
string s[N];
DirectedEulerPath euler;
map<string, int> comp;
void solve() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  int k = 3;
  for (int i = 1; i <= n; i++) {
    cin >> s[i];
    comp[s[i].substr(0, k - 1)];
    comp[s[i].substr(1, k - 1)];
  }
  int ct = 0;
  for (auto &it : comp) {
    it.second = ++ct;
    rev[ct] = it.first;
  }
  euler.init(ct);
  for (int i = 1; i <= n; i++) {
    int u = comp[s[i].substr(0, k - 1)];
    int v = comp[s[i].substr(1, k - 1)];
    euler.add_edge(u, v);
  }
  if (!euler.getPath())
    cout << "NO" << '\n';
  else {
    cout << "YES" << '\n';
    string ans = rev[euler.path[0]];
    for (int i = 1; i < euler.path.size(); i++)
      ans += rev[euler.path[i]].back();
    cout << ans << '\n';
  }
}
signed main() {
  cout << fixed << setprecision(10);
  auto start = std::chrono::high_resolution_clock::now();
  int t = 1;
  while (t--) {
    solve();
  }
  auto stop = high_resolution_clock::now();
  auto duration = duration_cast<microseconds>(stop - start);
  cerr << "Time taken : "
       << ((long double)duration.count()) / ((long double)1e9) << "s " << '\n';
  return 0;
}
