#include <iostream>
//#include <strings.h>

using namespace std;

#define REP(i,n) for(int i=0; i<(n); i++)
#define debug(x) cout << #x << " : " << (x) <<  endl;

int dp[20][1<<14], n, kaburi[20][20];
string str[20];

bool issubstring(string x, string y){
  // return true when y is a substring of x
  // O(|x|*|y|)
  if (y.length() > x.length()){
    return false;
  }
  int yl = y.length();
  for (int j=0; j+y.length()<=x.length(); j++){
    string subx= x.substr(j, yl);
    if (subx==y){
      return true;
    }
  }
  return false;
}

int func(int a, int bit){
  // 最後に追加した文字列がstr[a], 残っている文字列がbit
  // 残っている文字列を並べたときの最小の長さを返す
  
  if (dp[a][bit]>=0){
//    cout << "dp" << endl;
    return dp[a][bit];
  }
  int ret = 1000000000;
  string now = str[a];
  
  REP(i,n){
    if (i==a || ((bit>>i) & 1)==0){
      continue;
    }
    
    string next = str[i];
//    printf("now: %s, next: %s\n", now.c_str(), next.c_str());
    
    if ((bit^(1<<i))==0) {
      // nextしか残っていなかった場合
      ret = min(ret, (int)next.length() - kaburi[a][i]);
    }else{
      ret = min(ret, func(i, bit^(1<<i)) + (int)next.length() - kaburi[a][i]);
    }
//    debug(next);
//    debug(ret);
  }
  dp[a][bit] = ret;
  return ret;
}

int main(){
  
  while(1) {
    int ans = 1000000000;
    cin >> n;
    if (n==0){
      break;
    }
    
    REP(i, 20){
      REP(j, 1<<14){
        dp[i][j] = -1;
      }
    }
    REP(i,n){
      REP(j,n){
        kaburi[i][j] = 0;
      }
    }
    
    REP(i, n) {
      cin >> str[i];
    }
    
    if (n==1){
      cout << str[0].length() << endl;
      continue;
    }

    REP(j,n){
      REP(k,n){
        if (j!=k && issubstring(str[j], str[k])){
          str[k] = "";
        }
      }
    }
    
    REP(i,n){
      REP(j,n){
        string now = str[i];
        string next = str[j];
        for (int k=1; k<min(now.length(), next.length()); k++){
          // 被っている部分の長さを調べる
          string nowsub = now.substr(now.length()-k);
          string nextsub = next.substr(0, k);
//          debug(nowsub);
//          debug(nextsub);
          if (nowsub==nextsub) {
            kaburi[i][j] = k;
//            debug(k);
          }
        }
      }
      
    }

    REP(i, n) {
//    debug(((1<<n)-1)^(1<<i));
      ans = min(ans, (int)str[i].length() + func(i, ((1 << n) - 1) ^ (1 << i)));
//      cout << "-----------------" << endl;
    }
    cout << ans << endl;
  }
  return 0;
  
}
