#include <bits/stdc++.h>
using namespace std;
vector<unordered_multiset<int>> adjlist;
string s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
vector<int> tour;
void dfs(int node) {
  while (adjlist[node].size() > 0) {
    auto it = adjlist[node].begin();
    int ind = *it;
    adjlist[node].erase(it);
    dfs(ind);
  }
  tour.push_back(node);
}
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  int n;
  cin >> n;
  int ns = s.size();
  int nnodes = ns * ns;
  adjlist.resize(nnodes);
  vector<int> cmap(128);
  for (int i = 0; i < s.size(); i++) {
    cmap[int(s[i])] = i;
  }
  vector<int> indegree(nnodes);
  vector<int> outdegree(nnodes);
  for (int i = 0; i < n; i++) {
    string s;
    cin >> s;
    int a = cmap[int(s[0])] * ns + cmap[int(s[1])];
    int b = cmap[int(s[1])] * ns + cmap[int(s[2])];
    adjlist[a].insert(b);
    outdegree[a]++;
    indegree[b]++;
  }
  int start = -1;
  int end = -1;
  int usable = -1;
  bool works = true;
  for (int i = 0; i < nnodes; i++) {
    if (indegree[i] == 0 && outdegree[i] == 0) {
      continue;
    }
    usable = i;
    if (indegree[i] == outdegree[i]) {
      continue;
    }
    if (indegree[i] + 1 == outdegree[i]) {
      if (start == -1) {
        start = i;
      } else {
        works = false;
        break;
      }
    } else if (indegree[i] == outdegree[i] + 1) {
      if (end == -1) {
        end = i;
      } else {
        works = false;
        break;
      }
    } else {
      works = false;
      break;
    }
  }
  if (!works) {
    cout << "NO\n";
    return 0;
  }
  dfs(start == -1 ? usable : start);
  if (n + 2 != tour.size() + 1) {
    cout << "NO\n";
    return 0;
  }
  cout << "YES\n";
  int b = tour.back();
  cout << s[b / s.size()] << s[b % s.size()];
  for (int i = tour.size() - 2; i >= 0; i--) {
    cout << s[tour[i] % s.size()];
  }
  cout << '\n';
}
