#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const double PI = 3.141592653589793238463;
const int INF = 0x3f3f3f3f;
const int INFS = 1000000001;
const long long LLINF = 9223372036854775807;
const long long M = 1000000007;
const double EPS = 1e-8;
const int alf = 128;
int to(char a, char b) {
  int res = a * alf + b;
  return res;
}
vector<vector<int> > g;
vector<int> path = {};
string ans;
void find(int v) {
  int u;
  while (!g[v].empty()) {
    u = g[v].back();
    g[v].pop_back();
    find(u);
  }
  ans += char(v % alf);
  path.push_back(v);
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  cout.tie(NULL);
  int n;
  cin >> n;
  string t;
  int m = alf * alf + 1;
  g.resize(m, {});
  vector<vector<int> > rg(m);
  int anyv;
  for (int i = 0; i < n; i++) {
    cin >> t;
    anyv = to(t[0], t[1]);
    g[to(t[0], t[1])].push_back(to(t[1], t[2]));
    rg[to(t[1], t[2])].push_back(to(t[0], t[1]));
  }
  int vfrom = -1, vto = -1;
  bool ok = true;
  for (int v = 0; v < m; v++) {
    if (g[v].size() > rg[v].size()) {
      if (vfrom == -1 && g[v].size() - rg[v].size() == 1)
        vfrom = v;
      else
        ok = false;
    } else if (g[v].size() < rg[v].size()) {
      if (vto == -1 && rg[v].size() - g[v].size() == 1)
        vto = v;
      else
        ok = false;
    }
  }
  if ((vfrom == -1 && vto != -1) || (vfrom != -1 && vto == -1)) ok = false;
  if (!ok) {
    cout << "NO"
         << "\n";
    return 0;
  }
  if (vfrom == -1) vfrom = anyv;
  find(vfrom);
  ans += char(vfrom / alf);
  reverse(ans.begin(), ans.end());
  if (ans.size() != n + 2) {
    cout << "NO"
         << "\n";
    return 0;
  }
  cout << "YES"
       << "\n";
  cout << ans << "\n";
  return 0;
}
