#include <bits/stdc++.h>
using namespace std;
const long long N = 2e5 + 1;
vector<long long> ed[2 * N];
long long in[2 * N];
long long out[2 * N];
bool vis[2 * N];
map<string, long long> mp;
map<long long, string> rev;
map<long long, long long> M[2 * N];
long long id = 0;
long long start = 0;
vector<long long> ans;
void add(string str) {
  if (mp.find(str) == mp.end()) {
    mp[str] = id;
    rev[id] = str;
    id++;
  }
}
void dfs(long long v) {
  vis[v] = true;
  for (long long x : ed[v]) {
    if (!vis[x]) dfs(x);
  }
  return;
}
bool path() {
  long long i, cnt1, cnt2;
  long long inner, outer;
  for (i = cnt1 = cnt2 = 0; i < id; i++) {
    if (out[i] - in[i] == 1) {
      cnt1++;
      inner = i;
    } else if (in[i] - out[i] == 1) {
      cnt2++;
      outer = i;
    } else if (in[i] != out[i])
      return false;
  }
  if (cnt1 + cnt2 == 0)
    return true;
  else if ((cnt1 == 1 && cnt2 == 1)) {
    start = inner;
    return true;
  }
  return false;
}
void euler_dfs(long long v) {
  stack<long long> st;
  st.push(v);
  long long cnt = 0;
  while (!st.empty()) {
    long long top = st.top();
    auto it = M[top].begin();
    if (M[top].empty()) {
      st.pop();
      ans.push_back(top);
    } else {
      long long nxt = (*M[top].begin()).first;
      st.push(nxt);
      M[top][nxt]--;
      if (M[top][nxt] == 0) M[top].erase(nxt);
    }
  }
  reverse(ans.begin(), ans.end());
  cout << rev[ans[0]];
  for (long long i = 1; i < ans.size(); i++) {
    cout << rev[ans[i]][1];
  }
  cout << endl;
  return;
}
int main() {
  memset(in, 0, sizeof(in));
  memset(out, 0, sizeof(out));
  memset(vis, false, sizeof(vis));
  long long n;
  cin >> n;
  for (long long i = 0; i < n; i++) {
    string s;
    cin >> s;
    string a = s.substr(0, 2);
    string b = s.substr(1, 2);
    add(a);
    add(b);
    long long ida = mp[a], idb = mp[b];
    in[idb]++;
    out[ida]++;
    M[ida][idb]++;
    ed[ida].push_back(idb);
  }
  long long head = 0;
  for (long long i = 0; i < id; i++) {
    if (in[i] == 0) {
      head = i;
      break;
    }
  }
  dfs(head);
  for (long long i = 0; i < id; i++) {
    if (!vis[i]) {
      cout << "NO" << endl;
      return 0;
    }
  }
  if (!path()) {
    cout << "NO" << endl;
    return 0;
  }
  cout << "YES" << endl;
  euler_dfs(start);
}
