#include <iostream> 
#include <string> 
#include <vector> 
#include <cmath> 
#include <algorithm> 
#include <cstdlib> 
#include <ctime> 
#include <cstdio> 
#include <functional> 
#include <set> 
#include <sstream> 
#include <cctype>
#include <stack>
#include <queue>
#include <cstring>
#include <map>
#include <list>
#include <cassert>
 
using namespace std; 

int n;
string city[15];
string tmp[15];
int dp[1<<15][15];
int cost[15][15];
bool ng[15];
const int inf=512;

int main(){
	
	while(cin>>n,n){

		for(int i=0;i<n;i++) cin>>tmp[i];

		fill(&ng[0],&ng[n],false);
		//?????¨?????????????????????????????????
		for(int i=0;i<n;i++){
			if(ng[i]) continue;
			for(int j=0;j<n;j++){
				if(i==j) continue;

				if(tmp[i].find(tmp[j])!=string::npos) ng[j]=true;
			}
		}

		int m=0;
		for(int i=0;i<n;i++){
			if(!ng[i]) city[m++]=tmp[i];
		}

		n=m;
		const int N=1<<n;
		
		fill(&dp[0][0],&dp[N][n],inf);
		fill(&cost[0][0],&cost[n][n],inf);

		for(int i=0;i<n;i++){
			dp[1<<i][i]=city[i].size();
		}

		//city[i]????????????city[j]?????????????????????
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				if(i==j) cost[i][j]=0;
				//city[i]???????????????len????????¨city[j]????????????len??????????????????
				int li=city[i].size(),lj=city[j].size();
				for(int len=min(li,lj);len>=0;len--){
					if(city[i].substr(li-len,len)==city[j].substr(0,len)){
						cost[i][j]=lj-len;
						break;
					}
				}
			}
		}

		for(int bit=1;bit<N;bit++){
			int from=n;
			while(from--){
				if(!(bit&(1<<from))) continue;
				int to=n;
				while(to--){
					if(bit&(1<<to)) continue;
					dp[bit|(1<<to)][to]=min(dp[bit|(1<<to)][to],dp[bit][from]+cost[from][to]);
				}
			}
		}
		
		cout<<*min_element(dp[N-1],dp[N])<<endl;

	}

}