#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pb push_back
const int N=15;
const int K=26;
const int M=155;
const int inf=1e9+7;
char s[N][M];
int lps[N][N],len[N],kmp[2*M],n,k;
int GetLPS(int x, int y)
{
	for(int i=2,j=0;i<=len[y];i++)
	{
		while(j && s[y][i]!=s[y][j+1]) j=kmp[j];
		if(s[y][j+1]==s[y][i]) j++;
		kmp[i]=j;
	}
	for(int i=1,j=0;i<=len[x];i++)
	{
		while(j && s[x][i]!=s[y][j+1]) j=kmp[j];
		if(s[y][j+1]==s[x][i]) j++;
		if(i==len[x]) return j;
	}
}
char t[2*M];
bool Check(int x, int y, int z)
{
	int sz=0;
	for(int i=1;i<=len[x];i++) t[++sz]=s[x][i];
	for(int i=lps[x][y]+1;i<=len[y];i++) t[++sz]=s[y][i];
	for(int i=2,j=0;i<=len[z];i++)
	{
		while(j && s[z][i]!=s[z][j+1]) j=kmp[j];
		if(s[z][j+1]==s[z][i]) j++;
		kmp[i]=j;
	}
	int cnt=0;
	for(int i=1,j=0;i<=sz;i++)
	{
		while(j && t[i]!=s[z][j+1]) j=kmp[j];
		if(s[z][j+1]==t[i]) j++;
		if(j==len[z]) cnt++;
	}
	return cnt==0;
}
int SubStr(int y, int x)
{
	for(int i=2,j=0;i<=len[y];i++)
	{
		while(j && s[y][i]!=s[y][j+1]) j=kmp[j];
		if(s[y][j+1]==s[y][i]) j++;
		kmp[i]=j;
	}
	int cnt=0;
	for(int i=1,j=0;i<=len[x];i++)
	{
		while(j && s[x][i]!=s[y][j+1]) j=kmp[j];
		if(s[y][j+1]==s[x][i]) j++;
		if(j==len[y]) cnt++;
	}
	return cnt;
}
bool ok[N];
int dp[1<<(N-1)][N],go[1<<(N-1)][N],can[1<<(N-1)][N][N],good[N][N][N];
int Resi(int _N, int _K, int* L, char** A, char* S)
{
	n=_N;k=_K;
	for(int i=1;i<=n;i++)
	{
		len[i]=L[i];
		for(int j=1;j<=L[i];j++)
		{
			s[i][j]=A[i][j];
			if((s[i][j]-'a'+1)>k) return -1;
		}
	}
    for(int i=1;i<=n;i++)
	{
		ok[i]=1;
		for(int j=1;j<=n;j++) if(i!=j && (len[i]<len[j] || (j<i && len[i]==len[j])))
		{
			if(SubStr(i,j)) ok[i]=0;
		}
		//printf("i:%i ok:%i\n",i,ok[i]);
	}
	int nn=0;
	for(int i=1;i<=n;i++) if(ok[i])
	{
		nn++;
		if(i!=nn)
		{
			len[nn]=len[i];
			for(int j=1;j<=len[i];j++) s[nn][j]=s[i][j];
		}
	}
	n=nn;
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i!=j)
	{
		lps[i][j]=GetLPS(i,j);
		//printf("LPS %i %i = %i\n",i,j,lps[i][j]);
	}
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int l=1;l<=n;l++)
	{
		if(i==j || i==l || j==l) continue;
        good[i][j][l]=Check(i,j,l);
	}
	for(int i=1;i<=n;i++) dp[1<<(i-1)][i]=len[i];
	for(int mask=1;mask<(1<<n);mask++) if(__builtin_popcount(mask)>1)
	{
		for(int i=1;i<=n;i++) if((mask>>(i-1))&1)
		{
			dp[mask][i]=inf;
            int nmsk=mask^(1<<(i-1));
            for(int j=1;j<=n;j++) if((nmsk>>(j-1))&1)
			{
				bool ok=1;
				for(int l=1;l<=n;l++) if((nmsk>>(l-1))&1)
				{
					if(l==j) continue;
					if(!good[j][i][l]) ok=0;
				}
				if(ok)
				{
					int add=len[i]-lps[j][i];
					if(dp[mask][i]>dp[nmsk][j]+add)
					{
						go[mask][i]=j;
						dp[mask][i]=dp[nmsk][j]+add;
					}
				}
			}
		}
	}
	int all=(1<<n)-1;
	int fir=1,best=dp[all][1];
	vector<int> ord;
	for(int i=1;i<=n;i++) if(dp[all][i]<best) best=dp[all][i],fir=i;
	if(best==inf) return -1;
	int mask=all;
	while(mask>0)
	{
		ord.pb(fir);
		int nf=go[mask][fir];
		mask^=1<<(fir-1);
		fir=nf;
	}
	reverse(ord.begin(),ord.end());
	int sz=0;
	//printf("Order: ");
	for(int i=0;i<ord.size();i++)
	{
		int x=ord[i];
		//printf("%i ",x);
        if(i==0) for(int j=1;j<=len[x];j++) s[0][++sz]=s[x][j];
        else
		{
			int st=lps[ord[i-1]][x];
			for(int j=st+1;j<=len[x];j++) s[0][++sz]=s[x][j];
		}
	}
	len[0]=sz;
	n=_N;
	for(int i=1;i<=n;i++)
	{
		len[i]=L[i];
		for(int j=1;j<=L[i];j++) s[i][j]=A[i][j];
	}
	for(int i=1;i<=n;i++) if(SubStr(i,0)>1) return -1;
	for(int i=1;i<=len[0];i++) S[i]=s[0][i];
	//printf("\n");
	return best;
}