#include <bits/stdc++.h>
using namespace std;
int cvalue(char c) {
  if (c >= 'a' and c <= 'z') return c - 'a';
  if (c >= 'A' and c <= 'Z') return c - 'A' + 26;
  return c - '0' + 52;
}
int value(const string& s) { return cvalue(s[0]) * 62 + cvalue(s[1]); }
char symb(int n) {
  n %= 62;
  if (n < 26) return 'a' + n;
  n -= 26;
  if (n < 26) return 'A' + n;
  n -= 26;
  return '0' + n;
}
string full(int n) {
  string s(2, ' ');
  s[0] = symb(n / 62);
  s[1] = symb(n);
  return s;
}
vector<vector<int> > G;
vector<int> indegree, outdegree;
vector<int> eindex;
stack<int> path;
const int maxn = 62 * 62;
void euler_path(int u) {
  while (eindex[u] < int(G[u].size())) {
    int v = G[u][eindex[u]];
    ++eindex[u];
    euler_path(v);
  }
  path.push(u);
}
int connected(int u) {
  vector<bool> vis(maxn, false);
  queue<int> q;
  vis[u] = true;
  int t = 1;
  q.push(u);
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    for (int to : G[v]) {
      if (!vis[to]) {
        vis[to] = true;
        ++t;
        q.push(to);
      }
    }
  }
  return t;
}
int main() {
  ios_base::sync_with_stdio(false);
  int n;
  cin >> n;
  G = vector<vector<int> >(maxn);
  indegree = vector<int>(maxn, 0);
  outdegree = vector<int>(maxn, 0);
  eindex = vector<int>(maxn, 0);
  int numnodes = 0;
  int start = 0;
  for (int i = 0; i < n; ++i) {
    string s;
    cin >> s;
    int u = value(s.substr(0, 2));
    int v = value(s.substr(1, 2));
    start = u;
    G[u].push_back(v);
    if (!(indegree[v] || outdegree[v])) ++numnodes;
    if (u != v && !(indegree[u] || outdegree[u])) ++numnodes;
    ++indegree[v];
    ++outdegree[u];
  }
  int odd = 0;
  bool pos = true;
  for (int i = 0; i < maxn; ++i) {
    if (outdegree[i] > indegree[i]) start = i;
    if (abs(indegree[i] - outdegree[i]) == 1)
      ++odd;
    else if (indegree[i] != outdegree[i])
      pos = false;
  }
  pos &= (odd <= 2);
  pos &= (connected(start) == numnodes);
  if (!pos)
    cout << "NO" << endl;
  else {
    cout << "YES" << endl;
    euler_path(start);
    bool first = true;
    while (!path.empty()) {
      int u = path.top();
      path.pop();
      if (first) {
        cout << full(u);
        first = false;
      } else
        cout << symb(u);
    }
    cout << endl;
  }
}
