/*
???????°??????°?????????????????????????????´????????´?????????????????¨??????????????????
???????????°?????????dp[2n][n]???????¬???????????????¨??????????????? 2 ?¬??????????????°????????????????
*/
#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
#include <vector>
#include <bitset>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
#define rep(i,n) for(int i=0;i<(n);i++)
#define reps(i,f,n) for(int i=(f);i<(n);i++)

const int MAX_N = 15;
const int INF = 1e9;


int cost[MAX_N][MAX_N];//cost[i][j] := (?????????j????????????i?????????????????¨????????????????????????)
//?????????j????????????i??????????????????????????§???????????????????????????????????????i?????????????????????
int dp[1<<MAX_N][MAX_N];

//?????????a????????????b???????????????????????????????????????????????´????????¨???????????????????±?????????¢??°
int getcost(string a, string b){
	int res = INF;
	//?????????a??????????????????(???????????????)????????????b????????????(??????????????????)????????¨??§????????????????????????????¨????
	for (int i = a.size() - 1, st = 0; i >= 0 && st < b.size(); --i, ++st){
		string ca = a.substr(i, a.size() - i);//?????????a???i????????????????????§
		string cb = b.substr(0, st + 1);//?????????b???0???????????????st+1?????????
		if(ca == cb) res = st + 1;
	}
	return res;
}

int main(void){
	int n;
	while(1){
		cin >> n;
		if(n == 0) return 0;
		vector<string> tmp(n);
		vector<string> name;
		rep(i, n) cin >> tmp[i];

		rep(i, n){
			bool flag = false;
			rep(j, n){
				if(i == j) continue;
				//?????????tmp[j]?????????????????????tmp[i]?????????????????????????????????????????????
				if(tmp[j].find(tmp[i]) != string::npos){
					flag = true;//????????????????????????????????¨?????????
					break;
				}
			}
			//?????????tmp[i]????????????????????????????????¨???????????????????????§???dp????????§???????????????name?????\??????
			if(flag == false) name.push_back(tmp[i]);
		}
		n = name.size();//?????????dp????????§????????°

		rep(i, MAX_N)rep(j, MAX_N) cost[i][j] = INF;
		//?????????[i]?????????????????????[j]??????????????????cost????¨????
		rep(i, n){
			rep(j, n){
				if(i ==	j){
					cost[i][j] = name[i].size();
					continue;
				}
				int ct = getcost(name[i], name[j]);
				if(ct == INF) cost[i][j] = name[j].size();//???????????¨????????????
				else cost[i][j] = name[j].size() - ct;
			}
		}

		rep(i, 1<<MAX_N)rep(j, MAX_N) dp[i][j] = INF;//????°?????????¢????????§??????????????§??????????????§
		rep(i, n) dp[1<<i][i] = name[i].size();//?????????????????????????????????

		//bitDp????????£????§£???
		//dp[1<<n][i] ??¶??????1<<n?????§?????¨?????????i???????????????????°???????????????¨??????
		rep(S, (1<<n)){
			rep(mae, n){//?????´?????????
				if(!(S>>mae) & 1) continue;//?????´??????????????????
				rep(usiro, n){//????????´?????????
					if((S>>usiro) & 1) continue;//????????´????????????????????§????????????????????¨??????
					//??????????¨??????¨???
					dp[S|(1<<usiro)][usiro] = min(dp[S|(1<<usiro)][usiro], dp[S][mae] + cost[mae][usiro]);
				}
			}
		}
		int ans = INF;
		rep(i, n) ans = min(ans, dp[(1<<n) - 1][i]);

		printf("%d\n", ans);
	}
	return 0;
}
	

Measured memory_bytes: 5052