#include <bits/stdc++.h>
using namespace std;
const int MX = (1 << 20);
int cnt(char ch) {
  if (islower(ch)) return ch - 'a' + 1;
  if (isupper(ch)) return ch - 'A' + 27;
  if (isdigit(ch)) return ch - '0' + 53;
}
int hashy(char a, char b) {
  int let1 = cnt(a), let2 = cnt(b);
  return (let1 - 1) * 62 + let2;
}
vector<int> v[MX];
int N, n = 4001, indeg[MX], outdeg[MX], timer = 0, low[MX], depth[MX], start;
bool nosol = 0, vi[MX];
string str[MX];
map<int, vector<int> > dict[4009];
void dfs(int x) {
  low[x] = depth[x] = ++timer;
  vi[x] = 1;
  int _sz = v[x].size(), nxt;
  for (int j = 0; j < _sz; j++) {
    nxt = v[x][j];
    if (!depth[nxt]) {
      dfs(nxt);
      low[x] = min(low[x], low[nxt]);
    } else if (vi[nxt])
      low[x] = min(low[x], depth[nxt]);
  }
  if (low[x] == depth[x] && x != start) nosol = 1;
}
stack<int> S;
int main() {
  cin >> N;
  for (int j = 1; j <= N; j++) {
    int U, V;
    cin >> str[j];
    U = hashy(str[j][0], str[j][1]);
    V = hashy(str[j][1], str[j][2]);
    indeg[V]++;
    outdeg[U]++;
    v[U].push_back(V);
    dict[U][V].push_back(j);
  }
  int src = 0, snk = 0;
  for (int j = 1; j <= n; j++) {
    if (indeg[j] - outdeg[j] == 1) snk = j;
    if (outdeg[j] - indeg[j] == 1) src = j;
  }
  for (int j = 1; j <= n; j++) {
    if (j == src || j == snk) continue;
    if (indeg[j] != outdeg[j]) {
      nosol = 1;
    }
  }
  if ((!src && snk) || (snk && !src)) nosol = 1;
  if (src + snk == 0)
    for (int j = 1; j <= n; j++)
      if (indeg[j] != outdeg[j]) nosol = 1;
  if (nosol) {
    puts("NO");
    return 0;
  }
  if (src) {
    start = src;
    v[snk].push_back(src);
  } else
    for (int j = 1; j <= n; j++)
      if (v[j].size()) start = j;
  dfs(start);
  if (nosol) {
    puts("NO");
    return 0;
  }
  for (int j = 1; j <= n; j++)
    if ((indeg[j] || outdeg[j]) && !depth[j]) nosol = 1;
  if (nosol) {
    puts("NO");
    return 0;
  }
  puts("YES");
  if (src) v[snk].pop_back();
  S.push(start);
  vector<int> sol;
  while (!S.empty()) {
    int x = S.top(), _sz = v[x].size(), nxt;
    if (v[x].size()) {
      nxt = v[x].back();
      v[x].pop_back();
      S.push(nxt);
      continue;
    }
    sol.push_back(x);
    S.pop();
  }
  reverse(sol.begin(), sol.end());
  string ans;
  int curst, par = sol[0], node = sol[1];
  curst = dict[par][node].back();
  ans += str[curst].substr(0, 2);
  for (int j = 1; j < sol.size(); j++) {
    par = sol[j - 1], node = sol[j];
    curst = dict[par][node].back();
    ans.push_back(str[curst][2]);
    dict[par][node].pop_back();
  }
  cout << ans << endl;
}
