#include <iostream>
#include <algorithm>
#include <limits>
#include <string>
#include <vector>
using namespace std;

const int kInf = numeric_limits< int >::max() / 2;

int N, Li[14];
string str[14];
vector< string > vstr;
int ln[14][14];

void preprocess(void);
void solve(void);

int main() {
  while (cin >> N, N) {
    for (int i = 0; i < N; ++i) cin >> str[i], Li[i] = str[i].length();
    preprocess();
    solve();
  }

  return 0;
}

void preprocess(void) {
  bool is_cntd[14];

  fill(&is_cntd[0], &is_cntd[14], false);
  for (int i = 0; i < N; ++i)
    for (int j = 0; j < N && !is_cntd[i]; ++j) {
      if (i == j) continue;
      if (Li[i] < Li[j] || (Li[i] == Li[j] && i < j)) {
        if (str[j].find(str[i]) != string::npos)
          is_cntd[i] = true;
      }
    }

  vstr.clear();
  for (int i = 0; i < N; ++i)
    if (!is_cntd[i])
      Li[vstr.size()] = Li[i], vstr.push_back(str[i]);
  N = vstr.size();

  for (int i = 0; i < N; ++i)
    for (int j = 0; j < N; ++j) {
      if (i == j) continue;
      int k = min(Li[i], Li[j]) - 1;
      while (k >= 0) {
        if (vstr[i].compare(Li[i] - k, Li[i], vstr[j], 0, k) == 0)
          break;
        --k;
      }
      ln[i][j] = Li[j] - k;
    }
}

void solve(void) {
  static int f[1 << 14][14], res;

  fill(&f[0][0], &f[1 << N][0], kInf);
  for (int i = 0; i < N; ++i)
    f[1 << i][i] = Li[i];

  for (int i = 0; i < (1 << N); ++i)
    for (int j = 0; j < N; ++j)
      if (f[i][j] < kInf)
        for (int k = 0; k < N; ++k)
          if (!(1 << k & i))
            f[1 << k | i][k] = min(f[1 << k | i][k], f[i][j] + ln[j][k]);

  res = kInf;
  for (int i = 0; i < N; ++i)
    res = min(res, f[(1 << N) - 1][i]);
  cout << res << "\n";
}