/*
当前长的那个表示方法的最后一个元素是谁。
以及相对较短的那个差了几个字符。
然后枚举往短的那个加上哪个元素(字符串)
于是就成为了一个图, 求最短路就行。
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 100 + 5;
const int maxlen = 50 + 5;
int n;
char s[maxn][maxlen];
int len[maxn];
int toX[maxn][maxlen][maxn];
int toY[maxn][maxlen][maxn];
int cost[maxn][maxlen][maxn];
void init()
{
for(int i=0; i<n; i++) len[i] = strlen(s[i]);
for(int i=0; i<n; i++)
{
for(int j=1; j<=len[i]; j++)
{
for(int k=0; k<n; k++)
{
if(j == len[i] && k == i)
{
toX[i][j][k] = -1;
}
else if(memcmp(s[i]+len[i]-j, s[k], min(j, len[k])) == 0)
{
toX[i][j][k] = j > len[k] ? i : k;
toY[i][j][k] = abs(j - len[k]);
cost[i][j][k] = j > len[k] ? 0 : len[k] - j;
}
else
{
toX[i][j][k] = -1;
}
}
}
}
}
const int maxq = maxn * maxlen * 10;
int Q[maxq], begin, end;
bool inQ[maxn][maxlen];
int dist[maxn][maxlen];
void spfa()
{
begin = end = 0;
memset(inQ, 0, sizeof(inQ));
memset(dist, 0x3f, sizeof(dist));
for(int i=0; i<n; i++)
{
Q[end++] = i;
Q[end++] = len[i];
inQ[i][len[i]] = true;
dist[i][len[i]] = len[i];
}
while(begin != end)
{
int x = Q[begin++];
int y = Q[begin++];
if(begin == maxq) begin = 0;
inQ[x][y] = false;
for(int i=0; i<n; i++)
if(toX[x][y][i] != -1)
{
int xx = toX[x][y][i];
int yy = toY[x][y][i];
int ll = cost[x][y][i];
if(dist[xx][yy] > dist[x][y] + ll)
{
dist[xx][yy] = dist[x][y] + ll;
if(!inQ[xx][yy])
{
Q[end++] = xx;
Q[end++] = yy;
if(end == maxq) end = 0;
inQ[xx][yy] = true;
}
}
}
}
}
void output()
{
int ans = 0x3f000000;
for(int i=0; i<n; i++)
if(ans > dist[i][0])
ans = dist[i][0];
printf("%d\n", ans >= 0x30000000 ? -1 : ans);
}
int main()
{
while(scanf("%d", &n) && n)
{
for(int i=0; i<n; i++) scanf("%s", &s[i]);
init();
spfa();
output();
}
return 0;
}