#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <cstdlib>
#include <iomanip>
#include <ctime>
#include <utility>

#define x first
#define y second
#define mp make_pair
#define pb push_back
#define sqr(x) (x)*(x)
#define _with_file
#define TASK ""
#define forn(i, n) for(int i = 0; i < (int)n; ++i)

void quit(); 

using namespace std;

typedef long long i64;
typedef unsigned long long u64;
typedef long double ld;
typedef pair <int, int> PII;
typedef pair <i64, i64> PII64;
typedef pair <ld, ld> PLL;

const ld PI = acos(-1);
const ld EPS = 1e-10;
double __t;


int val(char c)
{
    if (c >= '0' && c <= '9')
        return c - '0';
    if (c >= 'a' && c <= 'z')
        return c - 'a' + 10;
    if (c >= 'A' && c <= 'Z')
        return c - 'A' + 36;
}

char symb(int x)
{
    if (x < 10)
        return x + '0';
    if (x < 36)
        return x + 'a' - 10;
    return x + 'A' - 36; 
}

int toi(char c1, char c2)
{
    return val(c1)*62 + val(c2); 
}

string tos(int x)
{
    string res = "";
    res += symb(x/62);
    res += symb(x%62);
    return res;
}

int n;

vector <int> g[4000];
int p[4000];
bool u1[4000];
bool u2[4000];
vector <int> ans;

void dfs(int v)
{
    u2[v] = 1;
    while(p[v] < (int)g[v].size())
        dfs(g[v][p[v]++]);
    ans.pb(v);
}

int in[4000];
int out[4000];

int bc, ec;
int b, e;

int main()
{
    #ifdef local
        __t = clock();
        #ifndef _with_files
            freopen("z.in", "rt", stdin);
            freopen("z.out", "wt", stdout);
        #endif
    #endif
    #ifdef _with_files
        freopen(TASK".in", "rt", stdin);
        freopen(TASK".out", "wt", stdout);
    #endif
    cin >> n;
    string s;
    b = -1;
    for(int i = 0; i < n; ++i)
    {
        cin >> s;
        g[toi(s[0], s[1])].pb(toi(s[1], s[2]));
        u1[toi(s[0], s[1])] = 1;
        u1[toi(s[1], s[2])] = 1;
    }
    for(int i = 0; i < 4000; ++i)
    {
        out[i] = g[i].size();
        for(int j = 0; j < (int)g[i].size(); ++j)
            in[g[i][j]]++;
    }
    for(int i = 0; i < 4000; ++i)
    {
        if (u1[i])
        {
            if (in[i] == out[i] + 1)
            {
                e = i;
                ec++;
            } else
            {
                if (in[i] == out[i] - 1)
                {
                    b = i;
                    bc++;
                }
                else
                {
                    if (in[i] != out[i])
                    {
                        cout << "NO";
                        quit();
                    }
                }
            }
        }
    }
    if (!((bc == 1 && ec == 1) || (bc == 0 && ec == 0)))
    {
        cout << "NO";
        quit();
    }
    if (b == -1)
    {
        for(int i = 0; i < 4000; ++i)
        {
            if (u1[i])
            {
                b = i;
                break;
            }   
        }
    }    
    dfs(b);
    for(int i = 0; i < 4000; ++i)
    {
        if (u1[i] != u2[i])
        {
            cout << "NO";
            quit();
        }
    }  
    reverse(ans.begin(), ans.end());
    cout << "YES\n";
    cout << tos(ans[0])[0];
    for(int i = 1; i < (int)ans.size()-1; ++i)
        cout << tos(ans[i])[0]; 
    cout << tos(ans.back());
    quit();
}

void quit()
{
    #ifdef local
        cerr << "\nTOTAL TIME: "<< (clock() - __t)/1000.0 << " s\n";
    #endif
    exit(0);        
}
