#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
const int MAXN = 4 * (int)1e3;
unordered_map<string, int> number;
unordered_map<int, string> text;
vector<int> graph[MAXN];
int in[MAXN], ind[MAXN], used[MAXN], amount = 0;
vector<int> answer;
void impossible() {
  cout << "NO";
  exit(0);
}
void dfs(int v) {
  used[v] = 1;
  for (; ind[v] < (int)graph[v].size();) {
    dfs(graph[v][ind[v]++]);
    answer.push_back(v);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int n;
  cin >> n;
  for (int i = 0; i < n; ++i) {
    string s;
    cin >> s;
    string temp1 = s.substr(0, 2), temp2 = s.substr(1, 2);
    number[temp1] = (number[temp1] ? number[temp1] : ++amount);
    number[temp2] = (number[temp2] ? number[temp2] : ++amount);
    text[number[temp1]] = temp1;
    text[number[temp2]] = temp2;
    graph[number[temp1]].push_back(number[temp2]);
    in[number[temp2]]++;
    in[number[temp1]]--;
  }
  int c1 = 0, c2 = 0, i1 = -1, i2 = -1;
  for (int i = 1; i <= amount; ++i) {
    if (abs(in[i]) > 1) impossible();
    if (in[i] == 1) {
      c1++;
      i1 = i;
    }
    if (in[i] == -1) {
      c2++;
      i2 = i;
    }
  }
  if (c1 != c2 || c1 > 1 || c2 > 1) impossible();
  if (c1) {
    graph[i1].push_back(i2);
  }
  dfs(1);
  for (int i = 1; i <= amount; ++i) {
    if (!used[i]) impossible();
  }
  reverse(answer.begin(), answer.end());
  if (c1) {
    int index_ = -1;
    for (int i = 0; i < (int)answer.size() - 1; ++i) {
      if (answer[i] == i1 && answer[i + 1] == i2) {
        index_ = i;
      }
    }
    cout << "YES\n";
    cout << text[answer[index_ + 1]];
    for (int i = index_ + 2; i < answer.size(); ++i) cout << text[answer[i]][1];
    for (int i = 0; i <= index_; ++i) cout << text[answer[i]][1];
  } else {
    cout << "YES\n";
    cout << text[answer[0]];
    for (int i = 1; i < answer.size(); ++i) cout << text[answer[i]][1];
    cout << text[answer[0]][1];
  }
}
