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

int calc_distance(string a, string b) {
    
    for(int i = (int)min(a.size(), b.size()); i >= 0; i--) {
        bool ok = true;
        for(int j = 0; j < i; j++) {
            if(a[a.size() - i + j] != b[j]) {
                ok = false;
                break;
            }
        }
        
        if(ok) {
            return -i;
        }   
    }
           
    return 0;
}


int n;
int dist[15][15];
int memo[15][1 << 15];

int dfs(int v, int state) {
    int res = 0;
    
    if(memo[v][state] <= 0) {
        return memo[v][state];   
    }
    
    for(int i = 0; i < n; i++) {
        if(!(state >> i & 1)) {
            res = min(res, dfs(i, state | 1 << i) + dist[v][i]);
        }
    }
    
    return memo[v][state] = res;
}

int main() {
    
    while(true){
        cin >> n;
        
        if(n == 0) {
            break;
        }
        
        vector<string> s(n);
      
        for(int i = 0; i < n; i++) {
            cin >> s[i];
        }
        
        int len = 0;
        
        for(int i = n - 1; i >= 0; i--) {
            for(int j = 0; j < n; j++) {
                if(i == j) {
                    continue;
                }
                
                if(s[j].find(s[i]) != s[j].npos) {
                    s.erase(s.begin() + i);
                    n--;
                    
                    break;
                }
            }
        }
        
        for(int i = 0; i < n; i++) {
            len += s[i].size();
        }
        
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                dist[i][j] = calc_distance(s[i], s[j]);
            }
        }

        int mini = 0;
        fill((int*)memo, (int*)(memo + 15), 1);

        for(int i = 0; i < n; i++) {
            mini = min(mini, dfs(i, 1 << i));   
        }

        cout << len + mini << endl;
    }
}
