#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <utility>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;

#define rep(i,n) for(int i=0; i<n; i++)
typedef long long ll;
typedef pair<int,int> pii;

const int INF = 1e7;

int dp[1<<14][14];
int conn[14][14];

int main() {
	int n;
	while(cin >> n, n) {
		vector<string> ins(n);
		rep(i, n) {
			cin >> ins[i];
		}

		vector<string> in;
		rep(i, n) {
			bool dup = false;
			rep(j, n) {
				if(i==j) continue;
				if( ins[j].find(ins[i]) != string::npos ) {
					dup = true;
					break;
				}
			}
			if(!dup) in.push_back(ins[i]);
		}
		n = in.size();

		rep(i, n) {
			rep(j, n) {
				if( in[i].find(in[j]) != string::npos ) {
					conn[i][j] = 0;
				} else {
					int t = min(in[i].length(), in[j].length()) - 1;
					while(t>0 && in[i].substr(in[i].length()-t) != in[j].substr(0, t)) t--;
					conn[i][j] = in[j].length() - t;
				}
			}
		}

		rep(i,(1<<n)) rep(j,n) dp[i][j] = INF;
		for(int i=0; i<n; i++) {
			dp[1<<i][i] = in[i].length();
		}
		for(int i=0; i<(1<<n); i++) {
			for(int x=0; x<n; x++) {
				if(i & (1<<x)) {
					rep(j, n) {
						if( (i & (1<<j)) == 0 ) {
							int k = i | (1<<j);
							int st = dp[i][x] + conn[x][j];
							if( dp[k][j]==0 || dp[k][j] > st ) {
								dp[k][j] = st;
							}
						}
					}
				}
			}
		}

		int mini = INF;
		rep(i, n) {
			mini = min( mini, dp[(1<<n)-1][i] );
		}
		cout << mini << endl;
	}
	return 0;
}