#include <bits/stdc++.h>
using namespace std;
const int MAXn = 2e5 + 10, MAXx = 62 + 10;
multiset<string> st;
vector<int> g[MAXx][MAXx];
int n, adj[MAXx][MAXx], invadj[MAXx][MAXx];
vector<char> vec;
char uncast(int ch) {
  if (ch < 26) return ch + 'a';
  if (ch < 52) return ch - 26 + 'A';
  return ch - 52 + '0';
}
int cast(char ch) {
  if (ch >= 'a' && ch <= 'z')
    return ch - 'a';
  else if (ch >= 'A' && ch <= 'Z')
    return ch - 'A' + 26;
  return ch - '0' + 52;
}
void dfs(int a, int b) {
  while (adj[a][b]) {
    int u = g[a][b][--adj[a][b]];
    dfs(b, u);
  }
  vec.push_back(uncast(b));
}
string make(int st, int en) {
  string res;
  for (int i = st; i < en; i++) res += vec[i];
  return res;
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    string s;
    cin >> s;
    st.insert(s);
    g[cast(s[0])][cast(s[1])].push_back(cast(s[2]));
    adj[cast(s[0])][cast(s[1])]++;
    invadj[cast(s[1])][cast(s[2])]++;
  }
  bool flag = false, flag2 = false, flag3 = false;
  for (int i = 0; i < MAXx && !flag; i++)
    for (int j = 0; j < MAXx; j++)
      if (invadj[i][j] < adj[i][j]) {
        dfs(i, j);
        vec.push_back(uncast(i));
        flag = true;
        break;
      }
  for (int i = 0; i < MAXx && !flag; i++)
    for (int j = 0; j < MAXx; j++)
      if (g[i][j].size() && !flag) {
        dfs(i, j);
        vec.push_back(uncast(i));
        flag = true;
        break;
      }
  if (vec.size() != n + 2) return cout << "NO", 0;
  reverse(vec.begin(), vec.end());
  for (int i = 3; i <= vec.size(); i++) {
    string s = make(i - 3, i);
    if (st.find(s) == st.end()) {
      return cout << "NO", 0;
    }
    st.erase(st.find(s));
  }
  cout << "YES\n";
  for (int i = 0; i < vec.size(); i++) cout << vec[i];
}
