// 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.596239911769083x):
#include <algorithm>

#include <iostream>

#include <cstring>

#include <vector>

#include <cstdio>

#define INF 999999999

#define bit_set(integer,offset)   ((integer)|=1<<(offset))

#define bit_clear(integer,offset) ((integer)&=~(1<<(offset)))

#define bit_check(integer,offset) ((integer)&(1<<(offset)))

using namespace std;

int n,m,dp[16][33000],f[20][20];

char s[20][30],str[20][30];

int cal(char *a,char *b)

{

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

    for(int i=min(la-1,lb-1);i>=0;i--)

    {

        bool ok=true;

        for(int j=la-1,k=i;j>=0&&k>=0;j--,k--) if(b[k]!=a[j]) {ok=false;break;}

        if(ok) return i+1;

    }

    return 0;

}

int main()

{

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

    while(scanf("%d",&n)==1)

    {

        if(n==0) break;

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

        m=0;

        bool vis[20];

        memset(vis,0,sizeof(vis));

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

        {

            if(vis[i]) continue;

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

            {

                if(vis[j]||i==j) continue;

                if(strstr(s[i],s[j])) vis[j]=true;

            }

        }

        int le[20];

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

        {

            if(vis[i]) continue;

            int l=strlen(s[i]);

            strcpy(str[m],s[i]);

            le[m]=strlen(s[i]);

            m++;

        }

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

            for(int j=0;j<m;j++) f[i][j]=cal(str[i],str[j]);

        int M=1<<m;

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

        {

            for(int j=0;j<M;j++) dp[i][j]=INF;

            dp[i][1<<i]=le[i];

        }

        for(int j=1;j<M;j++)

        {

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

            {

                if(bit_check(j,i)==0) continue;

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

                {

                    if(bit_check(j,k)!=0) continue;

                    dp[k][j|(1<<k)]=min(dp[k][j|(1<<k)],dp[i][j]+le[k]-f[i][k]);

                }

            }

        }

        int ans=INF;

        for(int i=0;i<m;i++) ans=min(ans,dp[i][M-1]);

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

    }

}