#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<climits>
using namespace std;
#define rep(i,n) for(int i=0;i<(n);i++)
#define reg(i,a,b) for(int i=(a);i<=(b);i++)
#define irep(i,n) for(int i=((int)(n))-1;i>=0;i--)
#define ireg(i,a,b) for(int i=(b);i>=(a);i--)
typedef long long int lli;
typedef pair<int,int> mp;
#define fir first
#define sec second
#define IINF INT_MAX
#define LINF LLONG_MAX


int cs[20][20];

char dats[20][25];
int n;

bool isin(char* p,char* q){
	int lp = strlen(p);
	int lq = strlen(q);
	rep(i,lp){
		if(i+lq>lp)break;
		rep(j,lq){
			if(p[i+j]!=q[j])goto nexti;
		}
		return true;
nexti:;
	}
	return false;
}

int addlen(char* p,char* q){
	int lp = strlen(p);
	int lq = strlen(q);
	
	int minl = lq;
	rep(i,lp){
		int j=0;
		rep(j,lq){
			if(i+j>=lp)break;
			if(p[i+j]!=q[j])goto nexti;
		}
		return lq + i - lp;
nexti:;
	}
	return lq;
}


int dp[1<<15][20];




int main(void){
	
	while(1){
		scanf("%d",&n);
		if(n==0)break;
		memset(dp,-1,sizeof(dp));
		
		char id[20][25];
		rep(i,n){
			scanf("%s",id[i]);
		}
		
		int tn = 0;
		rep(i,n){
			bool issub = false;
			rep(j,n){
				if(i==j)continue;
				if(isin(id[j],id[i]))issub = true;
			}
			if(issub==false){
				strcpy(dats[tn],id[i]);
				tn++;
			}
		}
		
		n = tn;
		
		rep(i,n){
			rep(j,n){
				if(i==j)cs[i][j]=0;
				else{
					cs[i][j] = addlen(dats[i],dats[j]);
					//printf("%2d %s %s\n",cs[i][j],dats[i],dats[j]);
				}
			}
		}
		
		
		rep(i,n){
			dp[0][i]=0;
		}
		
		rep(i,1<<n){
			rep(j,n){
				if( ((1<<j)&i) == 0)continue;
				int fi = i-(1<<j);
				if(fi == 0){
					dp[i][j] = strlen(dats[j]);
				}
				else{
					dp[i][j] = IINF;
					rep(k,n){
						if(dp[fi][k]==-1)continue;
						dp[i][j] = min(dp[i][j] , dp[fi][k] + cs[k][j]);
					}
				}
			}
		}
		
		int ans = IINF;
		rep(i,n){
			ans = min(ans,dp[(1<<n)-1][i]);
		}
		printf("%d\n",ans);
	}
	return 0;
}