#include <bits/stdc++.h>
using namespace std;
const int N = 400100;
int vis[128][128];
pair<char, char> revHash[N];
int hashCount = 0;
inline int getHash(char a, char b) {
  if (vis[a][b] != -1) return vis[a][b];
  revHash[hashCount] = make_pair(a, b);
  return vis[a][b] = hashCount++;
}
int degIn[N], degOut[N], ptr[N];
vector<int> adj[N], adj2[N];
inline void addEdge(int u, int v) {
  adj[u].push_back(v);
  ++degOut[u], ++degIn[v];
  adj2[u].push_back(v);
  adj2[v].push_back(u);
}
int was[N];
void dfs(int u) {
  was[u] = true;
  for (int v : adj2[u])
    if (!was[v]) dfs(v);
}
inline bool isConnected(int n) {
  memset(was, false, sizeof(was));
  int numComps = 0;
  for (int i = 0; i < (n); ++i)
    if (!was[i]) {
      dfs(i);
      ++numComps;
    }
  return numComps == 1;
}
inline int isEulerian(int n) {
  int start = -1, end = -1;
  for (int i = 0; i < (n); ++i) {
    if (abs(degIn[i] - degOut[i]) > 1) return -1;
    if (degIn[i] == degOut[i] - 1) {
      if (start != -1) return -1;
      start = i;
    }
    if (degIn[i] == degOut[i] + 1) {
      if (end != -1) return -1;
      end = i;
    }
  }
  if (start != -1) return start;
  return 0;
}
vector<int> eulerPath;
void eulerDfs(int u) {
  while (ptr[u] < ((int)adj[u].size())) {
    int v = adj[u][ptr[u]];
    ++ptr[u];
    eulerDfs(v);
  }
  eulerPath.push_back(u);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  memset(ptr, 0, sizeof(ptr));
  memset(vis, -1, sizeof(vis));
  memset(degIn, 0, sizeof(degIn));
  memset(degOut, 0, sizeof(degOut));
  int n;
  cin >> n;
  for (int i = 0; i < (n); ++i) {
    string s;
    cin >> s;
    int u = getHash(s[0], s[1]);
    int v = getHash(s[1], s[2]);
    addEdge(u, v);
  }
  if (!isConnected(hashCount))
    cout << "NO\n";
  else {
    int src = isEulerian(hashCount);
    if (src == -1)
      cout << "NO\n";
    else {
      cout << "YES\n";
      eulerDfs(src);
      reverse(eulerPath.begin(), eulerPath.end());
      string ans = "";
      ans.push_back(revHash[eulerPath[0]].first);
      for (int i = 0; i < ((int)eulerPath.size()); ++i) {
        int u = eulerPath[i];
        ans.push_back(revHash[u].second);
      }
      assert(((int)ans.size()) == n + 2);
      cout << ans << '\n';
    }
  }
  return 0;
}
