#include <bits/stdc++.h>
using namespace std;

vector<string> v;
int k;

bool valid(string cur)
{
    for(int i=0;i<cur.size();i++)
    {
        if(cur[i]-'a'>=k)
        {
            return false;
        }
    }
    bool gcan=true,perm=true;
    for(int i=0;i<v.size() && !cur.empty();i++)
    {
        bool can=false;
        //printf("%d\n",cur.size()-v[i].size());
        for(int j=0;cur.size()>=v[i].size() && j<=cur.size()-v[i].size();j++)
        {
            bool tmpcan=true;
            for(int k=0;k<v[i].size();k++)
            {
                //printf("%d %d %d\n",cur.size(),j,k);
                if(v[i][k]!=cur[j+k])
                {
                    tmpcan=false;
                    break;
                }
            }
            if(tmpcan && can)
            {
                perm=false;
            }
            if(tmpcan)
            {
                can=true;
            }
        }
        if(!can)
        {
            gcan=false;
            break;
        }
    }
    if(gcan && perm && !cur.empty())
    {
        return true;
    }
    return false;
}

string solve(string cur)
{
    //cout<<cur<<"\n";
    bool gcan=true,perm=true;
    for(int i=0;i<v.size() && !cur.empty();i++)
    {
        bool can=false;
        //printf("%d\n",cur.size()-v[i].size());
        for(int j=0;cur.size()>=v[i].size() && j<=cur.size()-v[i].size();j++)
        {
            bool tmpcan=true;
            for(int k=0;k<v[i].size();k++)
            {
                //printf("%d %d %d\n",cur.size(),j,k);
                if(v[i][k]!=cur[j+k])
                {
                    tmpcan=false;
                    break;
                }
            }
            if(tmpcan && can)
            {
                perm=false;
            }
            if(tmpcan)
            {
                can=true;
            }
        }
        if(!can)
        {
            gcan=false;
            break;
        }
    }
    if(gcan && perm && !cur.empty())
    {
        return cur;
    }
    if(cur.size()==18)
    {
        return "!";
    }
    string tmp1=solve(cur+'a'),tmp2=solve(cur+'b');
    if(tmp1[0]=='!')
    {
        return tmp2;
    }
    if(tmp2[0]=='!')
    {
        return tmp1;
    }
    if(tmp1.size()<tmp2.size())
    {
        return tmp1;
    }
    return tmp2;
}

int Resi(int N, int K, int* L, char** A, char* S)
{
    k=K;
    for(int i=1;i<=N;i++)
    {
        string tmps="";
        for(int j=1;j<=L[i];j++)
        {
            tmps+=A[i][j];
        }
        v.push_back(tmps);
    }
    if(K==2 && N!=2)
    {
        string res=solve("");
        if(res[0]=='!')
        {
            return -1;
        }
        for(int i=0;i<res.size();i++)
        {
            S[i+1]=res[i];
        }
        return res.size();
    }
    int t=20;
    string res="!";
    while(t--)
    {
        string start=v[0];
        for(int i=1;i<v.size();i++)
        {
            int smax=0;
            for(int j=max(0,(int)start.size()-(int)v[i].size());j<start.size();j++)
            {
                bool can=true;
                for(int k=0;k+j<start.size();k++)
                {
                    if(start[k+j]!=v[i][k])
                    {
                        can=false;
                        break;
                    }
                }
                if(can)
                {
                    smax=(int)start.size()-j;
                    break;
                }
            }
            for(int j=smax;j<v[i].size();j++)
            {
                start+=v[i][j];
            }
        }
        if(valid(start) && (res[0]=='!' || res.size()>start.size() || (res.size()==start.size() && start<res)))
        {
            res=start;
        }
        next_permutation(v.begin(),v.end());
    }
    if(res[0]=='!')
    {
        return -1;
    }
    for(int i=0;i<res.size();i++)
    {
        S[i+1]=res[i];
    }
    return res.size();
}