#include "bits/stdc++.h"
using namespace std;
int d[14][14];
int dp[1<<14][14];//巡回セールスマン問題の最大路を管理
//すでに訪れた頂点集合がs、今いる頂点がv、最初にいた頂点がinit
int rec(int s,int v,int init,int n)
{
	//すでに計算終了している
	if(dp[s][v]<=0)
		return dp[s][v];

	//すべての頂点を訪れた
	if(s==(1<<n)-1)
	{
		return dp[s][v]=0;
	}

	int res=99999;
	for(int u=0;u<n;u++)
	{
		//まだuを訪れていない
		if((s&(1<<u))==0)
		{
			//次にuに移動する
			//cerr<<v<<" "<<u<<endl;
			res=min(res,rec(s|(1<<u),u,init,n)+d[v][u]);
		}
	}
	return dp[s][v]=res;
}

int main()
{
	while(1)
	{
		int n;
		cin>>n;
		if(n==0)
			break;
		vector<string> c;
		int sum=0;
		int ans=99999;
		for(int i=0;i<n;i++)
		{
			string s;
			cin>>s;
			c.push_back(s);
		}
		//完全に含まれる文字列が合った場合その文字列を消す
		bool f[14];
		fill(f,f+14,false);
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(i==j || f[j])
					continue;
				//含まれていた場合は消す
				if(c[j].find(c[i])!=string::npos)
				{
					f[i]=true;
					break;
				}
			}
		}
		for(int i=n-1;i>-1;i--)
		{
			if(f[i])
				c.erase(c.begin()+i);
		}
		n=c.size(); //消した分を除いて再定義
		fill(d[0],d[14],99999);
		//c[i]の最後とc[j]の最初の一致を調べる
		for(int i=0;i<n;i++)
		{
			sum+=c[i].size();
			for(int j=0;j<n;j++)
			{
				if(i==j)
					continue;
				//iのすべてを調べる
				for(int a=0;a<c[i].size();a++)
				{
					//これはc[i]の開始位置
					//ここにc[j]を重ねる
					bool f=true;
					//実現した場合の長さはc[i]の最後までかc[j]すべて
					int len=min(c[i].size()-a,c[j].size());
					for(int b=0;b<c[j].size();b++)
					{
						//終了条件
						if(a+b==c[i].size())
							break;
						if(c[i][a+b]!=c[j][b])
						{
							f=false;
							break;
						}
					}
					if(f)
						d[i][j]=min(d[i][j],-len);
					else
						d[i][j]=min(d[i][j],0);
				}
			}
		}

		//fordebug
		/*
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
				cerr<<min(d[i][j],25)<<" ";
			cerr<<endl;
		}*/
		//ここから巡回セールスマン問題
		for(int i=0;i<n;i++)
		{
			fill(dp[0],dp[1<<14],99999);
			ans=min(ans,rec(1<<i,i,i,n));
		}
		//cerr<<ans<<endl;
		cout<<sum+ans<<endl;
	}
	return 0;
}

