#include <bits/stdc++.h>
using namespace std;
int n;
char buf[5];
vector<string> v;
vector<pair<int, int> > ind[62][62];
int conv(char &a) {
  if (islower(a)) {
    return a - 'a';
  }
  if (isupper(a)) {
    return 26 + (a - 'A');
  }
  if (isdigit(a)) {
    return 52 + (a - '0');
  }
}
int deg[2];
int belong[62 * 62];
int siz[62 * 62];
int root(int b) {
  if (belong[b] == -1) {
    return b;
  }
  belong[b] = root(belong[b]);
  return belong[b];
}
void merge(int a, int b) {
  a = root(a);
  b = root(b);
  if (a == b) {
    return;
  }
  belong[a] = b;
  siz[b] += siz[a];
}
void me() {
  for (int i = 0; i < 62 * 62; i++) {
    belong[i] = -1;
    siz[i] = 1;
  }
}
vector<pair<int, int> > node;
vector<pair<int, int> > path;
int same = 0;
int ind1 = 0;
int gin = 0;
int ind2 = 0;
int gout = 0;
int ind3 = 0;
int in[62][62];
int out[62][62];
inline void dfs(int a, int b) {
  while (ind[a][b].size()) {
    int aa = ind[a][b].back().first;
    int bb = ind[a][b].back().second;
    ind[a][b].pop_back();
    dfs(aa, bb);
  }
  path.push_back(make_pair(a, b));
}
bool directed_eular() {
  int valid = 0;
  for (int i = 0; i < 62; i++) {
    for (int j = 0; j < 62; j++) {
      if (in[i][j] == 0 && out[i][j] == 0) {
        continue;
      }
      valid++;
      if (in[i][j] == out[i][j]) {
        same++;
        ind1 = i * 62 + j;
        continue;
      }
      if (in[i][j] + 1 == out[i][j]) {
        gout++;
        ind3 = i * 62 + j;
        continue;
      }
      if (in[i][j] - 1 == out[i][j]) {
        gin++;
        ind2 = i * 62 + j;
        continue;
      }
      return false;
    }
  }
  if (same == valid) {
    dfs(node[0].first, node[0].second);
    return true;
  }
  if (gin == 1 && gout == 1) {
    int b = ind3 % 62;
    ind3 /= 62;
    int a = ind3;
    dfs(a, b);
    return true;
  }
  return false;
}
string outt;
char rc(int a) {
  if (a < 26) {
    return 'a' + a;
  }
  if (a >= 52) {
    return '0' + (a - 52);
  }
  return 'A' + (a - 26);
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%s", buf);
    v.push_back(buf);
  }
  me();
  for (int i = 0; i < n; i++) {
    ind[conv(v[i][0])][conv(v[i][1])].push_back(
        make_pair(conv(v[i][1]), conv(v[i][2])));
    merge(62 * conv(v[i][0]) + conv(v[i][1]),
          62 * conv(v[i][1]) + conv(v[i][2]));
    node.push_back(make_pair(conv(v[i][0]), conv(v[i][1])));
    node.push_back(make_pair(conv(v[i][1]), conv(v[i][2])));
    int a = conv(v[i][0]);
    int b = conv(v[i][1]);
    int c = conv(v[i][2]);
    in[b][c]++;
    out[a][b]++;
  }
  sort(node.begin(), node.end());
  node.erase(unique(node.begin(), node.end()), node.end());
  int ro = node[0].first * 62 + node[0].second;
  if (siz[root(ro)] != node.size()) {
    puts("NO");
    return 0;
  }
  if (!directed_eular()) {
    puts("NO");
    return 0;
  }
  reverse(path.begin(), path.end());
  for (int i = 0; i < path.size(); i++) {
    if (i == 0) {
      outt.push_back(rc(path[i].first));
    }
    outt.push_back(rc(path[i].second));
  }
  if (outt.size() != n + 2) {
    puts("NO");
    return 0;
  }
  puts("YES");
  printf("%s", outt.c_str());
  puts("");
  return 0;
}
