// Slower C++ solution:
#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

const int inf = 0x3f3f3f3f;

int mp[30][30];

char str[20][122];

int dp[1<<15][15];

int st[122];

int getval(char *a,char *b)

{

    int la,lb,len;

    la = strlen(a),lb = strlen(b);



    for (int i = 0;i < la;i++)

        if (memcmp( &a[i],b,lb ) == 0) return 0;



    for (len = min(la,lb);len > 0;len--)

    {

        int i,j;

        for (i = la - len,j = 0;j < len;i++,j++)

            if (a[i] != b[j]) break;

        if (j == len) break;

    }

    return lb-len;

}



//int getval(int x,int y ){

//    int l1 = strlen(str[x]);

//    int l2 = strlen(str[y]);

//    if(l1 > l2)

//        for(int i = 0; i < l1; i++){

//            if(i + l2 > l1) break;

//            int h  = 0;

//            for(int j = 0; j < l2; j++){

//                if(str[x][i+j] == str[y][j]){

//                     h++;

//                }

//            }

//            if(h == l2) return 0;

//        }

//    int l = min(l1,l2),id = 0;

//    for(int i = l; i >= 1; i--){

//        bool flag = true;

//        for(int j = 0; j < i; j++){

//            if(str[x][l1 - (i - j)] == str[y][j] ) continue;

//            else {flag = false;break;}

//        }

//        if(flag) {id = i;break;}

//    }

//    //cout<<id<<endl;

//    return l2 - id;

//}

int main(){

    int N;

    while(cin>>N && N){

        memset(st,0,sizeof(st));

        for(int i  = 0; i < N; i++){

            scanf("%s",str[i]);

            st[i] = 1<<i;

        }

        for(int i = 0; i < N; i++){

            for(int j = 0; j < N; j++){

                int t = getval(str[i],str[j]);

                if(t == 0) {

                    st[i] |= 1<<j;

                    mp[i][j] = 0;

                }

                else mp[i][j] = t;

               // cout<<i<<" "<<j<<" "<<mp[i][j]<<endl;

            }





        }

         memset(dp,-1,sizeof(dp));

         for (int i = 0;i < N;i++)

            dp[st[i]][i] = strlen(str[i]);



        for (int s = 0;s < (1<<N);s++)

            for (int i = 0;i < N;i++) if (dp[s][i] != -1)

            {

                for (int j = 0;j < N;j++) if (  !(s&1<<j)  )

                {

                    int tmp = s|st[j];//s|1<<j;

                    if (dp[tmp][j] == -1) dp[tmp][j] = dp[s][i]+mp[i][j];

                    else dp[tmp][j] = min(dp[tmp][j],dp[s][i]+mp[i][j]);

                }

            }



//        memset(dp,0x3f,sizeof(dp));

//        for(int i = 0; i < N; i++){

//                //cout<<s[i]<<endl;

//                dp[1<<i][i] = strlen(str[i]);

//        }

//

//        for(int i = 0; i < 1 << N; i++)

//            for(int j = 0; j < N; j++){

//                if(dp[i][j] == inf) continue;

//               // cout<<i<<" "<<j<<" "<<dp[i][j]<<endl;

//                for(int k = 0; k < N; k++) if(!(i & 1 << k))

//                    dp[i|s[k]][k] = min(dp[i|s[k]][k],dp[i][j] + mp[j][k]);

//            }

        int ans = inf;

        for(int i = 0; i < N; i++)if(dp[(1<<N)-1][i]!=-1)

            ans = min(dp[(1<<N)-1][i],ans);

        cout<<ans<<endl;

    }

    return 0;

}

// Faster C++ solution for the same problem (measured speedup: 3.625031278777445x):
#include <cstdio>

#include <cstring>

#include <algorithm>

#include <vector>

#include <queue>

#include <map>

#include <string>

#include <iostream>



#define pb push_back

#define mp make_pair



using namespace std;



char s[15][25];

int calc[15][15];

bool flag[15];

int list[15],cnt;

int n,N;

int len[15];

int dp[1<<15][15];



int gao(int x,int y){

    int lenx = strlen(s[x]) , leny = strlen(s[y]);

    int ret=0;

    for (int i=1; lenx-i>=0 && i-1 < leny ; i++){

        bool flag=true;

        for (int j=0;j<=i-1;j++)

            if (s[y][j]!=s[x][lenx-i+j]) flag=false;

        if (flag) ret=max(ret,i);

    }

    return ret;



}



bool inside(int x,int y){

    int lenx = strlen(s[x]) , leny = strlen(s[y]);

    if (lenx > leny) return false;

    bool flag=false;

    for (int i = 0 ; i <= leny - lenx ; i++){

        bool same=true;

        for (int j = 0 ; j < lenx ; j++)

            if (s[x][j]!=s[y][j+i]) same=false;

        if (same) flag=true;

    }

    return flag;

}



void prework(){

    // s[i]s[j]

    for (int i=0;i<n;i++)

        for (int j=0;j<n;j++)

            if (i!=j) calc[i][j] = gao(i,j);

}



int main(){



    //freopen("input.txt","r",stdin);



    while (~scanf("%d",&n) && n){

        for (int i=0;i<n;i++) scanf("%s",s[i]),flag[i]=true;



        for (int i=0;i<n;i++)

            for (int j=0;j<n;j++)

                if (i!=j && inside(i,j)) flag[i]=false;



        N=0;

        for (int i=0;i<n;i++)

            if (flag[i]) list[N++]=i;



        for (int i=0;i<n;i++) len[i]=strlen(s[i]);

        prework();



        for (int i=0;i<(1<<N);i++)

            for (int j=0;j<N;j++)

                dp[i][j]=0x3F3F3F3F ;



        for (int i=0;i<N;i++) dp[1<<i][i] = len[list[i]];

        for (int i=1;i<(1<<N);i++){

            for (int j=0;j<N;j++)

                if ((i>>j)&1)

                    for (int k=0;k<N;k++)

                        if (!((i>>k)&1))

                            dp[i|(1<<k)][k] = min(dp[i|(1<<k)][k] , dp[i][j] + len[list[k]] - calc[list[k]][list[j]]);

        }



        int ans=0x3F3F3F3F;

        for (int i=0;i<N;i++)

            ans = min(dp[(1<<N)-1][i],ans);

        printf("%d\n",ans);

    }

    return 0;

}