#include <bits/stdc++.h>
using namespace std;
const int ALPH = 255;
vector<vector<pair<int, int>>> g;
vector<int> order;
vector<bool> used;
vector<int> topsort;
vector<bool> uban;
void dfs(int v) {
  while (!g[v].empty()) {
    int to, ind;
    tie(to, ind) = g[v].back();
    g[v].pop_back();
    if (used[ind]) continue;
    used[ind] = true;
    dfs(to);
  }
  order.push_back(v);
}
void dfs2(int v) {
  if (used[v]) return;
  used[v] = true;
  for (auto &p : g[v]) {
    int to = p.first;
    dfs2(to);
  }
  topsort.push_back(v);
}
int dfs3(int v) {
  if (used[v]) return 0;
  used[v] = true;
  int ans = 0;
  for (auto &p : g[v]) {
    int to = p.first;
    ans += dfs3(to);
  }
  return ans + 1;
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int m;
  cin >> m;
  vector<string> strs(m);
  int n = ALPH * ALPH;
  g.assign(n, vector<pair<int, int>>());
  uban.assign(n, false);
  vector<int> deg_in(n, 0), deg_out(n, 0);
  for (int i = 0; i < m; ++i) {
    string t;
    cin >> t;
    strs[i] = t;
    int a, b;
    a = (int)(t[0]) * ALPH + (int)(t[1]);
    b = (int)(t[1]) * ALPH + (int)(t[2]);
    g[a].emplace_back(b, i);
    uban[a] = uban[b] = true;
    deg_out[a]++, deg_in[b]++;
  }
  int v1 = -1, v2 = -1;
  bool bad = false;
  for (int i = 0; i < n; ++i) {
    if (abs(deg_in[i] - deg_out[i]) > 1) {
      bad = true;
    }
    if (deg_in[i] > deg_out[i] && v1 == -1)
      v1 = i;
    else if (deg_in[i] > deg_out[i])
      bad = true;
    if (deg_out[i] > deg_in[i] && v2 == -1)
      v2 = i;
    else if (deg_out[i] > deg_in[i])
      bad = true;
  }
  used.assign(n, false);
  for (int i = 0; i < n; ++i)
    if (uban[i]) dfs2(i);
  used.assign(n, false);
  int val = dfs3(topsort.back());
  int val2 = 0;
  for (int i = 0; i < n; ++i) {
    val2 += uban[i];
  }
  if (val != val2) bad = true;
  if (bad) {
    cout << "NO\n";
    return 0;
  }
  if (v1 != -1) {
    g[v1].emplace_back(v2, m);
    m++;
  }
  used.assign(m, false);
  if (v1 == -1)
    dfs((int)(strs[0][0]) * ALPH + (int)(strs[0][1]));
  else
    dfs(v1);
  reverse(order.begin(), order.end());
  if (v1 != -1) {
    for (int i = 0; i + 1 < order.size(); ++i)
      if (order[i] == v1 && order[i + 1] == v2) {
        vector<int> ord2;
        for (int j = i + 1; j < order.size(); ++j) ord2.push_back(order[j]);
        for (int j = 1; j <= i; ++j) ord2.push_back(order[j]);
        order = ord2;
        break;
      }
    m--;
  }
  cout << "YES\n" << (char)(order[0] / ALPH);
  for (int i = 0; i < order.size(); ++i) {
    cout << (char)(order[i] % ALPH);
  }
}
