#include <bits/stdc++.h>
using namespace std;
namespace iB {
char buf[1 << 21], *p1 = buf, *p2 = buf;
}
namespace oB {
char buf[1 << 21], *p1 = buf, *p2 = buf + (1 << 21);
}
namespace Fastio {
struct Reader {
  char endch;
  Reader() { endch = '\0'; }
  Reader& operator>>(char& ch) {
    ch = (iB::p1 == iB::p2 && (iB::p2 = (iB::p1 = iB::buf) +
                                        fread(iB::buf, 1, 1 << 21, stdin),
                               iB::p1 == iB::p2)
              ? EOF
              : *iB::p1++);
    while (ch == ' ' || ch == '\r' || ch == '\n' || ch == '\t')
      ch = (iB::p1 == iB::p2 && (iB::p2 = (iB::p1 = iB::buf) +
                                          fread(iB::buf, 1, 1 << 21, stdin),
                                 iB::p1 == iB::p2)
                ? EOF
                : *iB::p1++);
    return *this;
  }
  Reader& operator>>(char* str) {
    while (((*str = (iB::p1 == iB::p2 &&
                             (iB::p2 = (iB::p1 = iB::buf) +
                                       fread(iB::buf, 1, 1 << 21, stdin),
                              iB::p1 == iB::p2)
                         ? EOF
                         : *iB::p1++)) == ' ' ||
            *str == '\n' || *str == '\r' || *str == '\t') &&
           *str != EOF)
      ;
    while ((*++str = (iB::p1 == iB::p2 &&
                              (iB::p2 = (iB::p1 = iB::buf) +
                                        fread(iB::buf, 1, 1 << 21, stdin),
                               iB::p1 == iB::p2)
                          ? EOF
                          : *iB::p1++)) != ' ' &&
           *str != '\n' && *str != '\r' && *str != '\t' && *str != EOF)
      ;
    *str = '\0';
    return *this;
  }
  template <typename Int>
  Reader& operator>>(Int& d) {
    bool flag = 0;
    endch = (iB::p1 == iB::p2 && (iB::p2 = (iB::p1 = iB::buf) +
                                           fread(iB::buf, 1, 1 << 21, stdin),
                                  iB::p1 == iB::p2)
                 ? EOF
                 : *iB::p1++);
    while ((!isdigit(endch)) && endch != '-' && endch != EOF)
      endch = (iB::p1 == iB::p2 && (iB::p2 = (iB::p1 = iB::buf) +
                                             fread(iB::buf, 1, 1 << 21, stdin),
                                    iB::p1 == iB::p2)
                   ? EOF
                   : *iB::p1++);
    if (endch == '-')
      flag = 1,
      endch = (iB::p1 == iB::p2 && (iB::p2 = (iB::p1 = iB::buf) +
                                             fread(iB::buf, 1, 1 << 21, stdin),
                                    iB::p1 == iB::p2)
                   ? EOF
                   : *iB::p1++);
    d = endch & 15;
    while (isdigit(endch = (iB::p1 == iB::p2 &&
                                    (iB::p2 = (iB::p1 = iB::buf) +
                                              fread(iB::buf, 1, 1 << 21, stdin),
                                     iB::p1 == iB::p2)
                                ? EOF
                                : *iB::p1++)))
      d = (d << 3) + (d << 1) + (endch & 15);
    if (flag) d = -d;
    return *this;
  }
  template <typename T>
  inline T get() {
    T Val;
    (*this) >> Val;
    return Val;
  }
};
struct Writer {
  ~Writer() { fwrite(oB::buf, 1, oB::p1 - oB::buf, stdout); }
  Writer& operator<<(const char ch) {
    ((oB::p1 == oB::p2 && fwrite(oB::p1 = oB::buf, 1, 1 << 21, stdout)),
     *oB::p1++ = ch);
    return *this;
  }
  Writer& operator<<(const char* ch) {
    while (*ch)
      ((oB::p1 == oB::p2 && fwrite(oB::p1 = oB::buf, 1, 1 << 21, stdout)),
       *oB::p1++ = *(ch++));
    return *this;
  }
  Writer& operator<<(char* ss) { return *this << (const char*)ss; }
  template <typename Int>
  Writer& operator<<(Int x) {
    static char buffer[33];
    static int top = 0;
    if (!x) {
      ((oB::p1 == oB::p2 && fwrite(oB::p1 = oB::buf, 1, 1 << 21, stdout)),
       *oB::p1++ = '0');
      return *this;
    }
    if (x < 0)
      ((oB::p1 == oB::p2 && fwrite(oB::p1 = oB::buf, 1, 1 << 21, stdout)),
       *oB::p1++ = '-'),
          x = -x;
    while (x) {
      buffer[++top] = '0' | (x % 10);
      x /= 10;
    }
    while (top)
      ((oB::p1 == oB::p2 && fwrite(oB::p1 = oB::buf, 1, 1 << 21, stdout)),
       *oB::p1++ = buffer[top--]);
    return *this;
  }
};
}  // namespace Fastio
Fastio::Reader kin;
Fastio::Writer kout;
int id(char x) {
  if (x <= '9')
    return x - '0';
  else if (x <= 'Z')
    return x - 'A' + 10;
  else
    return x - 'a' + 36;
}
char chr(int d) {
  if (d < 10)
    return d + '0';
  else if (d < 36)
    return d - 10 + 'A';
  else
    return d - 36 + 'a';
}
int id(char x, char y) { return id(x) * 62 + id(y); }
const int N = 2e5 + 7, M = 62 * 62 + 7;
void report_NO() {
  kout << "NO\n";
  exit(0);
}
int n;
vector<int> G[M];
int ind[M], cur[M];
int visit[N], cnt = 0;
void euler(int u) {
  while (cur[u] < G[u].size()) {
    int v = G[u][cur[u]++];
    euler(v);
  }
  visit[++cnt] = u;
}
signed main() {
  kin >> n;
  char x, y, z;
  for (int i = 1, u, v; i <= n; ++i) {
    kin >> x >> y >> z;
    u = id(x, y), v = id(y, z);
    G[u].push_back(v);
    ++ind[v];
  }
  int st = -1, ed = -1;
  for (int i = 0; i < 62 * 62; ++i)
    if (G[i].size() == ind[i] + 1) {
      if (~st) report_NO();
      st = i;
    } else if (G[i].size() == ind[i] - 1) {
      if (~ed) report_NO();
      ed = i;
    } else if (G[i].size() != ind[i])
      report_NO();
  if (!~st || !~ed)
    for (int i = 0; i < 62 * 62; ++i)
      if (!G[i].empty()) st = i;
  euler(st);
  assert(cnt <= n + 1);
  if (cnt != n + 1) report_NO();
  kout << "YES\n" << chr(visit[cnt] / 62);
  for (int i = cnt; i >= 1; --i) kout << chr(visit[i] % 62);
  kout << '\n';
  return 0;
}
