#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
const long double Pi = 3.14159265359;
const long long MOD = 1000 * 1000 * 1000 + 7;
const long long N = 2e5 + 10;
const long long INF = 1e18;
const long long LOG = 20;
map<string, vector<pair<string, long long>>> gin;
map<string, vector<pair<string, long long>>> gout;
long long n;
string s;
vector<string> A;
long long St, Fn;
vector<string> T;
bitset<N> mark;
long long Cnt = 0;
void tour(string v) {
  while (gin[v].size()) {
    long long sar = gin[v].size() - 1;
    if (!mark[gin[v][sar].second]) {
      string node = gin[v][sar].first;
      mark[gin[v][sar].second] = 1;
      gin[v].pop_back();
      tour(node);
    } else {
      gin[v].pop_back();
    }
  }
  T.push_back(v);
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> s;
    A.push_back(s);
    string s1 = "";
    s1 += s[0];
    s1 += s[1];
    string s2 = "";
    s2 += s[1];
    s2 += s[2];
    gout[s1].push_back({s2, i + 1});
    gin[s2].push_back({s1, i + 1});
  }
  for (auto u : gout) {
    if (((long long)gout[u.first].size()) - 1 ==
        ((long long)gin[u.first].size()))
      St++;
    if (((long long)gin[u.first].size()) - 1 ==
        ((long long)gin[u.first].size()))
      Fn++;
    if (abs(((long long)gin[u.first].size()) -
            ((long long)gout[u.first].size())) > 1)
      return cout << "NO", 0;
    ;
  }
  if (St > 1 || Fn > 1) return cout << "NO", 0;
  ;
  for (auto u : gin) {
    if (St != 0 && gout[u.first].size() + 1 == gin[u.first].size()) {
      tour(u.first);
      Cnt++;
    } else if (St == 0 && gin[u.first].size() != 0 &&
               gout[u.first].size() == gin[u.first].size()) {
      tour(u.first);
      Cnt++;
    }
  }
  if (Cnt > 1) {
    return cout << "NO", 0;
    ;
  }
  cout << "YES\n";
  cout << T[0];
  for (int i = 1; i < T.size(); i++) {
    cout << T[i][1];
  }
  return 0;
}
