#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
int n;
const int maxn = 4000;
inline int cz(char c) {
  if (isdigit(c)) return c - 48;
  if (65 <= c && c <= 90) return c - 55;
  if (97 <= c && c <= 122) return c - 61;
}
inline char fz(int c) {
  if (c < 10) return c + 48;
  if (10 <= c && c <= 35) return c + 55;
  if (36 <= c && c <= 61) return c + 61;
}
char c[4];
vector<int> ru[maxn], chu[maxn];
queue<int> q[maxn];
int lu[200010], sz[maxn], s[maxn], cnt;
bool ok = 0;
inline void dfs(int u) {
  while (!q[u].empty()) {
    int f = q[u].front();
    q[u].pop();
    dfs(f);
  }
  lu[++cnt] = u;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    c[0] = 0;
    while (!isgraph(c[0])) c[0] = getchar();
    c[1] = getchar();
    c[2] = getchar();
    int from = cz(c[0]) * 62 + cz(c[1]);
    int to = cz(c[1]) * 62 + cz(c[2]);
    ru[from].push_back(to), chu[to].push_back(from);
  }
  int jiadian = 0, jiandian = 0, id = -1, idx = -1;
  memset(sz, 0, sizeof(s));
  memset(s, 0, sizeof(s));
  for (int i = 0; i < 62 * 62; ++i)
    sz[i] = (int)ru[i].size(), s[i] = (int)chu[i].size();
  for (int i = 0; i < 62 * 62; ++i) {
    if (sz[i] > s[i]) {
      if (sz[i] - s[i] > 1)
        return puts("NO"), 0;
      else
        jiadian++, id = i;
    } else if (s[i] > sz[i]) {
      if (s[i] - sz[i] > 1)
        return puts("NO"), 0;
      else
        jiandian++, idx = i;
    }
  }
  if (!((jiandian == 1 && jiadian == 1) || (jiandian == 0 && jiadian == 0)))
    return puts("NO"), 0;
  if (id < 0)
    for (int i = 0; i < 62 * 62; ++i)
      if (chu[i].size()) id = i;
  for (int i = 0; i < 62 * 62; ++i)
    for (int j = 0; j < sz[i]; ++j) q[i].push(ru[i][j]);
  dfs(id);
  if (cnt != n + 1) return puts("NO"), 0;
  puts("YES");
  putchar(fz(lu[cnt] / 62));
  for (int i = n + 1; i >= 1; --i) putchar(fz(lu[i] % 62));
  exit(0);
}
