#include <bits/stdc++.h>
using namespace std;
ifstream in("input.txt");
ofstream out("output.txt");
const int MAX_SIZE = 7575;
int cipher(char a, char b) { return (a - '0') * 100 + (b - '0'); }
pair<char, char> deciph(int c) {
  return {(char)(c / 100 + '0'), (char)(c % 100 + '0')};
}
vector<multiset<int>> g;
vector<int> v_in;
int n;
void del_edge(int a, int b) { g[a].erase(g[a].find(b)); }
void input() {
  g.resize(MAX_SIZE + 1);
  v_in.resize(MAX_SIZE + 1, 0);
  cin >> n;
  for (int i = 0; i < n; i++) {
    string s;
    cin >> s;
    int a = cipher(s[0], s[1]);
    int b = cipher(s[1], s[2]);
    g[a].insert(b);
    v_in[b]++;
  }
}
int del_a = -1, del_b = -1;
bool check() {
  int b = -1, e = -1;
  for (int i = 0; i <= MAX_SIZE; i++) {
    if (g[i].size() == v_in[i])
      continue;
    else if (g[i].size() == v_in[i] + 1) {
      if (b != -1) return 0;
      b = i;
    } else if (g[i].size() + 1 == v_in[i]) {
      if (e != -1) return 0;
      e = i;
    } else
      return 0;
  }
  del_a = e;
  del_b = b;
  return 1;
}
void bad() {
  cout << "NO";
  exit(0);
}
vector<int> path;
void gen() {
  if (del_a != -1) g[del_a].insert(del_b);
  stack<int> st;
  for (int i = 0; i <= MAX_SIZE; i++) {
    if (g[i].size() > 0) {
      st.push(i);
      break;
    }
  }
  while (!st.empty()) {
    int v = st.top();
    if (g[v].size() != 0) {
      int to = *g[v].begin();
      del_edge(v, to);
      st.push(to);
    } else {
      st.pop();
      path.push_back(v);
    }
  }
  reverse(path.begin(), path.end());
}
void print_cond() {
  if (del_a != -1) {
    cout << "fictive edge: ";
    cout << deciph(del_a).first << deciph(del_a).second << ' '
         << deciph(del_b).first << deciph(del_b).second << '\n';
  }
  for (int x : path) {
    pair<char, char> p = deciph(x);
    cout << (char)p.first << (char)p.second << '\n';
  }
}
void print_ans() {
  if (del_a != -1) path.pop_back();
  vector<int> ans;
  if (del_a == -1) {
    ans = path;
  } else {
    int i;
    for (i = 1; i < path.size(); i++) {
      if (path[i] == del_b && path[i - 1] == del_a) break;
    }
    for (int j = i; j < path.size(); j++) ans.push_back(path[j]);
    for (int j = 0; j < i; j++) ans.push_back(path[j]);
  }
  if (ans.size() - 1 != n) bad();
  cout << "YES\n";
  cout << deciph(ans[0]).first << deciph(ans[0]).second;
  for (int i = 1; i < ans.size(); i++) cout << deciph(ans[i]).second;
}
int main() {
  cin.tie(0);
  cout.tie(0);
  cin.sync_with_stdio(0);
  cout.sync_with_stdio(0);
  ;
  input();
  if (!check()) bad();
  gen();
  print_ans();
}
