#include <bits/stdc++.h>

using namespace std;
int cost[25][25];
int dp[(1<<15)][15];
vector <int> order;
int n;
const int INF = 1e6;
int cnt[50];

void gogo(int mask,int idx)
{
    order.push_back(idx+1);
    if(mask==0)return ;
    if(__builtin_popcount(mask)==1)
    {
        for(int i = 0; i < n; i++)
        {
            if(mask&(1<<i))order.push_back(i+1);
        }
        return ;
    }
    for(int i = 0; i < n; i++)
    {
        if(!(mask&(1<<i)))continue;
        if(dp[mask^(1<<idx)][i]+cost[i+1][idx+1]==dp[mask][idx])
        {
            gogo(mask^(1<<idx),i);
            break;
        }
    }
}

int Resi(int N, int K, int* L, char** A, char* S)
{
    n=N;
    for(int i = 1; i <= N; i++)
    {
        for(int j = 1; j <= N; j++)
        {
            if(i==j)cost[i][j]=L[i];
            else
            {
                cost[i][j]=L[j];
                for(int k = 1; k <= min(L[i],L[j]); k++)
                {
                    bool flag=true;
                    for(int a = L[i]; a >= L[i]-k+1; a--)
                    {
                        for(int b = 1; b <= k; b++)
                        {
                            if(A[i][a]!=A[j][b])flag=false;
                        }
                    }
                    if(flag)cost[i][j]=L[j]-k;
                }
                if(cost[i][j]==0)cnt[j]++;
            }
        }
    }
    for(int i = 1; i <= N; i++)
    {
        if(cnt[i]==2)
        {
            return -1;
        }
    }
    for(int mask = 0; mask < (1<<N); mask++)
    {
        for(int i = 0; i < N; i++)
        {
            dp[mask][i]=INF;
            if(mask==0)dp[mask][i]=0;
            if(!(mask&(1<<i)))continue;
            if(__builtin_popcount(mask)==1)dp[mask][i]=L[i+1];
            for(int j = 0; j < N; j++)
            {
                if(i==j)continue;
                if(!(mask&(1<<j)))continue;
                dp[mask][i]=min(dp[mask][i],dp[mask^(1<<i)][j]+cost[j+1][i+1]);
            }
        }
    }
    int ans = 21132312213;
    for(int i = 0; i < N; i++)
    {
        ans=min(ans,dp[(1<<N)-1][i]);
    }
    for(int i = 0; i < N; i++)
    {
        if(dp[(1<<N)-1][i]!=ans)continue;
        gogo((1<<N)-1,i);
        break;
    }
    string ret = "";
    for(int j = 1; j <= L[order[order.size()-1]]; j++)ret += A[order[order.size()-1]][j];
    //string ret = v[order.size()-1];
    for(int i = order.size()-2; i >= 0; i--)
    {
        for(int j = cost[order[i+1]][order[i]]+1; j <= L[order[i]]; j++)
        {
            ret += A[i][j];
        }
    }
    for(int j = 0; j < ret.length(); j++)
    {
        S[j+1]=ret[j];
    }
    return ans;
}