#include <bits/stdc++.h>
using namespace std;
struct edge {
  int num;
  char c;
};
vector<string> v;
vector<string> invIndex;
vector<vector<edge> > A;
vector<int> indegree, outdegree;
int n, k;
bool operator<(edge const &e, edge const &f) { return (e.c < f.c); }
void makeGraph();
void makeString();
int look_up(string const &, int, int);
int main() {
  cin >> n;
  n += 2;
  k = 3;
  for (int i = 0; i < n - k + 1; i++) {
    string s;
    cin >> s;
    v.push_back(s);
  }
  for (unsigned int i = 0; i < v.size(); i++) {
    string s;
    s = v[i].substr(0, v[i].length() - 1);
    invIndex.push_back(s);
    s = v[i].substr(1, v[i].length() - 1);
    invIndex.push_back(s);
  }
  sort(invIndex.begin(), invIndex.end());
  vector<string>::iterator p = unique(invIndex.begin(), invIndex.end());
  invIndex.erase(p, invIndex.end());
  makeGraph();
  makeString();
  return 0;
}
int look_up(string const &s, int l, int r) {
  if (l == r) return l;
  int m = (l + r) / 2;
  if (invIndex[m] == s)
    return m;
  else if (invIndex[m] < s)
    return look_up(s, m + 1, r);
  else
    return look_up(s, l, m - 1);
}
void makeGraph() {
  A = vector<vector<edge> >(invIndex.size());
  indegree = outdegree = vector<int>(invIndex.size());
  for (unsigned int i = 0; i < v.size(); i++) {
    edge temp;
    string s = v[i].substr(0, v[i].length() - 1);
    int j = look_up(s, 0, invIndex.size() - 1);
    s = v[i].substr(1, v[i].length() - 1);
    temp.num = look_up(s, 0, invIndex.size() - 1);
    temp.c = v[i][v[i].length() - 1];
    outdegree[j]++;
    indegree[temp.num]++;
    A[j].push_back(temp);
  }
  for (unsigned int i = 0; i < A.size(); i++) sort(A[i].begin(), A[i].end());
}
void makeString() {
  int start = 0;
  int cnt = 0;
  bool bad = false;
  for (unsigned int i = 0; (i < A.size()) && !bad; i++) {
    if (outdegree[i] - indegree[i] > 1)
      bad = true;
    else if (indegree[i] - outdegree[i] > 1)
      bad = true;
    else if (outdegree[i] - indegree[i] == 1) {
      cnt++;
      start = i;
      if (cnt > 1) bad = true;
    }
  }
  if (bad) {
    cout << "NO" << endl;
    return;
  }
  vector<int> pos(A.size());
  string t;
  string t1;
  vector<int> seq;
  t = invIndex[start];
  bool done = false;
  int curr = start;
  seq.push_back(start);
  while (!done) {
    while (pos[curr] < A[curr].size()) {
      seq.push_back(A[curr][pos[curr]].num);
      t += A[curr][pos[curr]].c;
      pos[curr]++;
      curr = seq.back();
    }
    int i = seq.size() - 1;
    do {
      i--;
    } while ((i >= 0) && (pos[seq[i]] >= A[seq[i]].size()));
    if (i < 0)
      done = true;
    else {
      for (unsigned int l = 0; l < seq.size() - 1 - i; l++)
        t1 += t[t.length() - 1 - l];
      t.erase(t.end() - seq.size() + 1 + i, t.end());
      seq.erase(seq.end() - seq.size() + 1 + i, seq.end());
      curr = seq[i];
    }
  }
  reverse(t1.begin(), t1.end());
  t += t1;
  if (t.length() == n)
    cout << "YES" << endl << t << endl;
  else
    cout << "NO" << endl;
}
