#include <bits/stdc++.h>
const long long inf = 0x3f3f3f3f3f3f3f3LL;
const long long mod = (long long)1e9 + 7;
using namespace std;
template <class T, class T2>
void smin(T& a, T2 val) {
  if (a > val) a = val;
}
template <class T, class T2>
void smax(T& a, T2 val) {
  if (a < val) a = val;
}
const long long N = 5 * (long long)1e5 + 10;
long long n;
map<string, vector<string>> M;
map<string, long long> in, out;
void yes() { cout << "YES" << '\n'; }
void no() {
  cout << "NO" << '\n';
  exit(0);
}
vector<string> ans;
void dfs(string s) {
  vector<string>& v = M[s];
  while (!v.empty()) {
    auto lst = v.back();
    v.pop_back();
    dfs(lst);
  }
  ans.push_back(s);
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n;
  set<string> ms;
  for (long long i = 0; i < n; ++i) {
    string s;
    cin >> s;
    string st = "";
    st += s[0];
    st += s[1];
    string en = "";
    en += s[1];
    en += s[2];
    M[st].push_back(en);
    in[en]++;
    out[st]++;
    ms.insert(en);
    ms.insert(st);
  }
  string source = "", destination = "";
  for (auto it : ms) {
    if (in[it] == out[it]) {
      continue;
    }
    if (abs(out[it] - in[it]) > 1) {
      ;
      no();
    }
    if (out[it] == in[it] + 1) {
      if (source == "") {
        source = it;
      } else {
        ;
        no();
      }
    } else {
      assert(in[it] == out[it] + 1);
      if (destination == "") {
        destination = it;
      } else {
        ;
        no();
      }
    }
  }
  if (source != "" and destination == "") {
    no();
  }
  if (source == "") {
    source = *ms.begin();
  }
  dfs(source);
  reverse(ans.begin(), ans.end());
  if (ans.empty()) {
    no();
  }
  string ret = ans[0];
  for (long long i = 1; i < (long long)(ans.size()); ++i) {
    ret += ans[i].back();
  }
  if ((long long)(ret.size()) != n + 2) {
    no();
  }
  yes();
  cout << ret;
  return 0;
}
