#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 M=155;
const int inf=1e9+7;
char s[N][M];
int n,k,kmp[2*M],len[N];

int go[M][26],root,tsz;
int mark[M],my[N],link[M];
void Insert(int &c, char *s, int n, int id)
{
	if(!c) c=++tsz;
	if(n==0){ my[id]=c;mark[c]=id;return;}
	Insert(go[c][s[0]-'a'],s+1,n-1,id);
}
vector<int> E[M];
void BuildAhoCorasick()
{
	queue<int> q;
	for(int i=0;i<26;i++)
	{
		if(go[root][i]) q.push(go[root][i]),link[go[root][i]]=root;
		else go[root][i]=root;
	}
	while(q.size())
	{
		int u=q.front();
		q.pop();
		mark[u]|=mark[link[u]];
		for(int i=0;i<26;i++)
		{
			if(go[u][i])
			{
				link[go[u][i]]=go[link[u]][i];
				q.push(go[u][i]);
			}
			else go[u][i]=go[link[u]][i];
			//printf("%i %c %i\n",u,'a'+i,go[u][i]);
		}
	}
	for(int i=2;i<=tsz;i++) E[link[i]].pb(i);
}
int pre[M],pre_ch[M],dist[M],node[M];
int mat[N][N];
void DFS_C_Tree(int u)
{
	node[u]=u;
	for(int v:E[u])
	{
		DFS_C_Tree(v);
		dist[u]=min(dist[u],dist[v]);
		if(dist[u]==dist[v]) node[u]=node[v];
	}
}
void BFS(int u)
{
	int x=my[u];
	queue<int> q;
	for(int i=1;i<=tsz;i++) dist[i]=inf;
	q.push(x);
	dist[x]=0;
	while(q.size())
	{
		int y=q.front();
		q.pop();
		if(mark[y] && y!=my[u]) continue;
		for(int i=0;i<26;i++)
		{
			int h=go[y][i];
			if(dist[h]>dist[y]+1)
			{
				dist[h]=dist[y]+1;
				pre[h]=y;
				pre_ch[h]=i;
				q.push(h);
			}
		}
	}
	DFS_C_Tree(root);
	for(int i=1;i<=n;i++)
	{
		mat[u][i]=dist[my[i]];
	}
}

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;
}
int dp[1<<(N-1)][N],was_last[1<<(N-1)][N],ok[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++) if(!ok[i])
	//{
	//	Insert(root,A[i]+1,L[i],_N+1);
	//}
	for(int i=1;i<=n;i++) Insert(root,s[i]+1,len[i],i);
	BuildAhoCorasick();
	for(int i=1;i<=n;i++) BFS(i);

	//for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) printf("%i%c",mat[i][j],j==n?'\n':' ');

	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)
			{
				if(dp[mask][i]>dp[nmsk][j]+mat[j][i])
				{
					was_last[mask][i]=j;
					dp[mask][i]=dp[nmsk][j]+mat[j][i];
				}
			}
		}
	}
	int all=(1<<n)-1;
	int fir=1,best=dp[all][1];
	vector<int> ord,ls;
	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=was_last[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
		{
			BFS(ord[i-1]);
			int nod=node[my[x]];
			vector<char> cs;
			while(nod!=my[ord[i-1]])
			{
				cs.pb('a'+pre_ch[nod]);
				nod=pre[nod];
			}
			reverse(cs.begin(),cs.end());
			for(int j=0;j<cs.size();j++) s[0][++sz]=cs[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;
}