#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 8;
int n, sz;
map<string, std::vector<string> > g;
map<string, int> cnt, ind, out;
std::vector<string> path;
void dfs(string x) {
  while (cnt[x] < (int)g[x].size()) {
    string nxt = g[x][cnt[x]];
    cnt[x]++;
    dfs(nxt);
  }
  sz++;
  path.push_back(x);
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    string word;
    cin >> word;
    string a = "", b = "";
    a += word[0];
    a += word[1];
    b += word[1];
    b += word[2];
    g[a].push_back(b);
    if (ind.count(b) > 0)
      ind[b]++;
    else
      ind[b] = 1;
    if (out.count(a) > 0)
      out[a]++;
    else
      out[a] = 1;
  }
  string start = "-1";
  bool pos = true;
  int k = 0;
  for (auto a : g) {
    cnt[a.first] = 0;
    if (out[a.first] != ind[a.first]) {
      if (out[a.first] - 1 == ind[a.first]) {
        if (start == "-1")
          start = a.first;
        else
          pos = false;
      } else if (ind[a.first] - 1 == out[a.first]) {
        k++;
        if (k == 2) pos = false;
      } else {
        pos = false;
      }
    }
  }
  if (start == "-1") {
    for (auto a : g) {
      start = a.first;
      break;
    }
  }
  dfs(start);
  if (sz != n + 1) pos = false;
  if (!pos) {
    cout << "NO" << endl;
  } else {
    cout << "YES\n";
    reverse(path.begin(), path.end());
    cout << path[0];
    for (int i = 1; i < (int)path.size(); i++) {
      cout << path[i][1];
    }
    cout << endl;
  }
  return 0;
}
