#include <bits/stdc++.h>

#define MAXN 15
using namespace std;

/*
3 2
aba
ba
ab
*/
queue<string> q;
bool moze(string s,int N, int* L, char** A){
    //cout<<s<<"*"<<endl;
    for(int k=1;k<=N;k++){
        //cout<<L[k];
        int brp=0;
      //  s.substr(A[k]);
        if(s.size()<L[k])
            return false;
       /* for(int i=1;i<=L[k];i++)
            cout<<A[k][i];
        cout<<endl;*/
        for(int i=0;i<s.size();i++){
            //cout<<s[i];
            if(s[i]==A[k][1]){
                //cout<<i;
                bool mark1=true;
                for(int j=1;j<=L[k];j++){
                    if(i+j>s.size()){
                        mark1=false;
                        break;
                    }
                   // cout<<A[k][j];
                    if(A[k][j]!=s[i+j-1]){
                        mark1=false;
                        break;
                    }
                }
                if(mark1)
                    brp++;
            }
        }
        if(brp!=1)
            return false;
    }
    return true;
}
bool moze1(string s,int N, int* L, char** A){
    for(int k=1;k<=N;k++){
        int brp=0;
        for(int i=0;i<s.size();i++){
            if(s[i]==A[k][1]){
                bool mark1=true;
                for(int j=1;j<=L[k];j++){
                    //cout<<A[k][j];
                    if(i+j>s.size()){
                        mark1=false;
                        break;
                    }
                    if(A[k][j]!=s[i+j-1]){
                        mark1=false;
                        break;
                    }
                }
                if(mark1)
                    brp++;
            }
            if(brp>1)
                return false;
        }
    }
    return true;
}
int Resi1(int N, int* L, char** A, char* S) {
    q.push("");
    for(int i=1;i<=18;i++){
        string pom=q.front();
        while(pom.size()<i){
            q.pop();
            string pom1=pom+"a";
            //cout<<pom<<endl;
            if(moze(pom1,N,L,A)){
                copy(pom1.begin(), pom1.end(), S+1);
                return i;
            }

           /* if(moze1(pom1,N,L,A))*/
                q.push(pom1);
            //cout<<pom1<<"*"<<endl;
            string pom2=pom+"b";
            if(moze(pom2,N,L,A)){
                copy(pom2.begin(), pom2.end(), S+1);
                return i;
            }
           /* if(moze1(pom2,N,L,A))*/
                q.push(pom2);
            pom=q.front();
        }
    }
	return -1;
}
int Resi(int N, int K, int* L, char** A, char* S) {
    if(K==2)
        return Resi1(N,L,A,S);
    S[1] = 'a';
	return 1;
}