#include <bits/stdc++.h>
using namespace std;
template <class T, class U>
void ckmin(T &a, U b) {
  if (a > b) a = b;
}
template <class T, class U>
void ckmax(T &a, U b) {
  if (a < b) a = b;
}
const int MAXN = 3969;
int N;
vector<int> edge[MAXN];
vector<int> ord;
int dsu[MAXN];
int net[MAXN];
int get(int u) { return (u == dsu[u] ? u : dsu[u] = get(dsu[u])); }
void merge(int u, int v) {
  u = get(u);
  v = get(v);
  if (u == v) return;
  dsu[u] = v;
  return;
}
int getval(int x) {
  if ('a' <= x && x <= 'z') return x - 'a';
  if ('A' <= x && x <= 'Z') return 26 + x - 'A';
  if ('0' <= x && x <= '9') return 52 + (x - '0');
  assert(false);
}
char getc(int x) {
  if (0 <= x && x < 26) return 'a' + x;
  if (26 <= x && x < 52) return 'A' + x - 26;
  if (52 <= x) return '0' + x - 52;
  assert(false);
}
int32_t main() {
  cout << fixed << setprecision(12);
  cerr << fixed << setprecision(4);
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  iota(dsu, dsu + 3844, 0);
  cin >> N;
  for (auto i = (0); i < (N); i++) {
    string str;
    cin >> str;
    int x = getval(str[0]), y = getval(str[1]), z = getval(str[2]);
    edge[62 * x + y].push_back(62 * y + z);
    merge(62 * x + y, 62 * y + z);
  }
  N = 3844;
  int need = -1;
  for (auto i = (0); i < (N); i++) {
    if (!edge[i].empty()) need = get(i);
  }
  for (auto i = (0); i < (N); i++) {
    if (!edge[i].empty() && get(i) != need) {
      cout << "NO\n";
      return 0;
    }
  }
  for (auto i = (0); i < (N); i++) {
    net[i] += ((int)(edge[i]).size());
    for (int j : edge[i]) {
      net[j]--;
    }
  }
  int neg = -1, pos = -1;
  for (auto i = (0); i < (N); i++) {
    if (net[i] < -1 || net[i] > 1) {
      cout << "NO\n";
      return 0;
    }
    if (net[i] == -1) {
      if (neg != -1) {
        cout << "NO\n";
        return 0;
      }
      neg = i;
    }
    if (net[i] == 1) {
      if (pos != -1) {
        cout << "NO\n";
        return 0;
      }
      pos = i;
    }
  }
  swap(pos, neg);
  if (neg != -1) {
    edge[pos].push_back(neg);
  }
  vector<int> stk;
  stk.push_back(need);
  while (!stk.empty()) {
    int u = stk.back();
    if (edge[u].empty()) {
      ord.push_back(u);
      stk.pop_back();
    } else {
      stk.push_back(edge[u].back());
      edge[u].pop_back();
    }
  }
  reverse((ord).begin(), (ord).end());
  if (neg != -1) {
    ord.pop_back();
    if (ord.back() == pos && ord.front() == neg) {
    } else {
      for (auto i = (0); i < (((int)(ord).size()) - 1); i++) {
        if (ord[i] == pos && ord[i + 1] == neg) {
          rotate(ord.begin(), ord.begin() + i + 1, ord.end());
          break;
        }
      }
    }
  }
  cout << "YES\n";
  cout << getc(ord[0] / 62);
  for (int x : ord) {
    cout << getc(x % 62);
  }
  cout << '\n';
  return 0;
}
