#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#define ll long long
using namespace std;

int n;
int duzina[20];
char orec[20][160];
int rec[20][160];
int hes[20][160];

#define prost 1002017ll
#define gen 648138ll
ll polje[1002100];
void sredipolje()
{
    polje[0]=1;
    for(int i=1;i<prost;++i)
        polje[i]=(polje[i-1]*gen)%prost;
}
void sredislova()
{
    /*
    for(int r=0;r<n;++r)
    {
        for(int i=1;i<=duzina[r];++i)
            orec[r][i]=(char)rec[r][i];
    }
    */
    for(int r=0;r<n;++r)
    {
        for(int i=1;i<=duzina[r];++i)
            rec[r][i]=(orec[r][i]*52358ll)%prost;
    }
}
void ispisirec(int r)
{
    for(int i=1;i<=duzina[r];++i)printf("%c",orec[r][i]);
    printf("\n");
}

void hesuj(int r)
{
    hes[r][0]=0;
    for(int i=1;i<=duzina[r];++i)
        hes[r][i]=(hes[r][i-1]+polje[i-1]*rec[r][i])%prost;
}
void hesujsve()
{
    for(int i=0;i<n;++i)hesuj(i);
}
int hesf(int r, int l, int d)
{
    if(l>d)return 0;
    if(l==d)return rec[r][l];
    int raz=hes[r][d]-hes[r][l-1];
    if(raz==0) return (rec[r][l]+gen*hesf(r,l+1,d))%prost;
    if(raz<0)raz+=prost;
    return (raz*polje[prost-l])%prost;
}

int sadrzirec(int rveca,int rmanja)
{
    int dv=duzina[rveca];
    int dm=duzina[rmanja];
    int puta=0;
    for(int i=1;i+dm-1<=dv;++i)
        if(hesf(rmanja,1,dm)==hesf(rveca,i,i+dm-1))
            ++puta;
    return puta;
}
int residve(int r1,int r2)
{
    int d1=duzina[r1];
    int d2=duzina[r2];
    int poc=1;
    if(d2<=d1)poc=d1-d2+2;
    int kraj=d1+1;
    int ustedeo=-1;
    for(int i=poc;i<=kraj;++i)
    {
        if(hesf(r1,i,d1)==hesf(r2,1,d1-i+1))
        {
            //printf("radi %d\n\n",i);
            //znaci poklapaju se
            //sad gledam da ne sadrze jos nesto tamo gde se ove dve seku
            bool cisto=true;
            int presek=d1-i+1;
            //m je indeks srednje reci
            for(int m=0;m<n;++m)  if(duzina[m]>=presek+2)
            {
                //printf("rec %d:\n",m);
                bool imaga=false;
                int d3=duzina[m];
                int pocp=d1-d3+2;
                int krajp=i-1;
                //printf("  pocp: %d krajp: %d\n",pocp,krajp);
                for(int j=pocp;j<=krajp;++j)
                {
                    if(j==1&&m==r1)continue; //ovo je bitno
                    if(j==i&&m==r2)continue; //i ovo isto
                    int h1=hesf(r1,j,d1);
                    //printf("    h1=(%d,%d)=%d\n",j,d1,h1);
                    int h2=hesf(r2,d1-i+2,d3+j-i);
                    //printf("    h2=(%d,%d)=%d\n",d1-i+2,d3+j-i,h2);
                    int h=(h1+h2*polje[d1+1-j])%prost;
                    //printf("    h=%d\n",h);
                    //printf("    hes=%d\n",hes[m][d3]);
                    if(h==hes[m][d3])
                    {
                        imaga=true;
                        //printf("  pao %d\n",m);
                        break;
                    }
                }
                if(imaga)
                {
                    cisto=false;
                    break;
                }
            }
            if(cisto)
            {
                ustedeo=d1-i+1;
                break;
            }
        }
    }
    return ustedeo;
}
int resza2[20][20];
void srediresza2()
{
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<n;++j)
        {
            if(i==j)resza2[i][j]=-1;
            if(i==j)continue;
            resza2[i][j]=residve(i,j);
        }
    }
}

int sadrzanputa[20];
void sredisadrzanost()
{
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<n;++j)
        {
            if(i==j)continue;
            if(duzina[j]<duzina[i])continue;
            if(sadrzirec(j,i))
                ++sadrzanputa[i];
        }
    }
}

struct skup
{
    int maska;
    skup(int _maska)
    {
        maska=_maska;
    }
    skup()
    {
        maska=0;
    }
    bool ima(int r)
    {
        return (maska&(1<<r))>0;
    }
    skup ubaci(int r)
    {
        return skup(maska|(1<<r));
    }
    skup izbaci(int r)
    {
        return skup((maska|(1<<r))-(1<<r));
    }
    bool prazan()
    {
        return maska==0;
    }
};

//rekurzivna resenja
int najusteda[20][65000];
int slrec[20][65000];
void postavirekurziju()
{
    for(int i=0;i<n;++i)
    {
        for(int m=0;m<64000;++m)
        {
            najusteda[i][m]=-2;
            slrec[i][m]=-1;
        }
    }
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<n;++j)
        {
            skup js=skup().ubaci(j);
            if(i==j)najusteda[i][js.maska]=-1;
            najusteda[i][js.maska]=resza2[i][j];
            slrec[i][js.maska]=j;
        }
    }
    for(int i=0;i<n;++i)
    {
        najusteda[i][0]=0;
        slrec[i][0]=-1;
    }
}
void resi(int prvarec, skup ostatak);
int najustedaf(int prvarec, skup ostatak)
{
    if(najusteda[prvarec][ostatak.maska]==-2)
        resi(prvarec,ostatak);
    return najusteda[prvarec][ostatak.maska];
}
void resi(int prvarec, skup ostatak)
{
    int gotov=-1;
    int sl=-1;
    for(int i=0;i<n;++i)
    {
        int tres=-1;
        if(ostatak.ima(i))
        {
            int h=najustedaf(i,ostatak.izbaci(i));
            if(h>=0)
                tres=resza2[prvarec][i]+h;
        }
        if(tres>gotov)
        {
            gotov=tres;
            sl=i;
        }
    }
    najusteda[prvarec][ostatak.maska]=gotov;
    slrec[prvarec][ostatak.maska]=sl;
}
int ukust;
int prec;
skup pocsk;
void resiceoskup()
{
    skup ostatak=skup();
    for(int i=0;i<n;++i)
        if(sadrzanputa[i]==0)
            ostatak=ostatak.ubaci(i);
    pocsk=ostatak;
    int gotov=-1;
    int sl=-1;
    for(int i=0;i<n;++i)
    {
        int tres=-1;
        if(ostatak.ima(i))
        {
            int h=najustedaf(i,ostatak.izbaci(i));
            if(h>=0)
                tres=h;
        }
        if(tres>gotov)
        {
            gotov=tres;
            sl=i;
        }
    }
    ukust=gotov;
    prec=sl;
}

char film[160];
void ispisi()
{
    if(ukust==-1)
    {
        film[0]=0;
        return;
    }
    int r=prec;
    skup sk=pocsk.izbaci(r);
    int i=0;
    while(true)
    {
        for(int j=0;j<duzina[r];++j)
        {
            film[i+j+1]=orec[r][j+1];
            //printf("%c",orec[r][j+1]);
        }
        i+=duzina[r];
        if(sk.prazan())
        {
            film[i+1]=0;
            int iii;
            for(iii=1;film[iii]!=0;++iii)
                orec[18][iii]=film[iii];
            duzina[18]=iii-1;
            return;
        }
        int slr=slrec[r][sk.maska];
        i-=resza2[r][slr];
        r=slr;
        sk=sk.izbaci(r);
    }
}

int Resi(int N, int K, int* L, char** A, char* S)
{
    n=N;
    for(int i=0;i<n;++i)
        duzina[i]=L[i+1];
    for(int i=0;i<n;++i)
        for(int j=1;j<=duzina[i];++j)
            rec[i][j]=orec[i][j]=A[i+1][j];
    sredipolje();
    sredislova();
    hesujsve();
    //printf("polje,slova\n");
    srediresza2();
    //printf("parovi\n");
    /*
        printf("\n");
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<n;++j)
            printf("%d  ",resza2[i][j]);
        printf("\n");
    }
        printf("\n");
    */
    sredisadrzanost();
    //printf("sadrzanost\n");
    /*
    for(int i=0;i<n;++i)
        printf("%d ",sadrzanputa[i]);
    */
    //return 0;
    postavirekurziju();
    //printf("baza rekurzije\n");
    //return 0;
    resiceoskup();
    ispisi();
    for(int i=1;i<=duzina[18];++i)
        rec[18][i]=(orec[18][i]*52358ll)%prost;
    hesuj(18);
    for(int i=0;i<n;++i)
    {
        if(sadrzirec(18,i)!=1)
            ukust=-1;
    }
    //printf("\nkraj mozda?\n");
    //printf("prec: %d\n",prec);
    //printf("pocsk: %d\n",pocsk.maska);
    for(int i=0;film[i+1]!=0;++i)
    {
        S[i+1]=film[i+1];
        S[i+2]=0;
    }
    int zbir=0;
    for(int i=0;i<n;++i)
        if(sadrzanputa[i]==0)zbir+=duzina[i];
    zbir-=ukust;
    if(ukust==-1)return -1;
    return zbir;
}

int mainn()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int N, K;
	cin >> N >> K;
	char** A = new char*[N+1];
	int* L = new int[N+1];
	char* S = new char[65536];
	for (int i=1; i<=N; i++) {
		string s;
		cin >> s;
		A[i] = new char[s.size() + 2];
		copy(s.begin(), s.end(), A[i]+1);
		A[i][s.size() + 1] = 0;
		L[i] = s.size();
	}
	int res = Resi(N, K, L, A, S);
	cout << res << '\n';
	if (res >= 0) {
		for (int i=1; i<=res; i++)
			cout << S[i];
		cout << '\n';
	}
	for (int i=1; i<=N; i++)
		delete[] A[i];
	delete[] A;
	delete[] L;
	delete[] S;
}