#include <bits/stdc++.h>
#define maxN 15

using namespace std;

string a[maxN],s;
vector<pair<int,int>> adj[maxN];

bool proveri(string a,string b,int x){
for(int i=x;i<a.size() && i-x<b.size();i++){
    if(a[i]!=b[i-x]) return false;
}
return true;
}

bool proveri1(string s){
int cnt=0;
for(int i=0;i<s.size()-a[1].size()+1;i++){
    if(proveri(s,a[1],i)) cnt++;
}
//cout<<s<<" "<<cnt<<endl;
if(cnt!=1) return false;
cnt=0;
for(int i=0;i<s.size()-a[2].size()+1;i++){
    if(proveri(s,a[2],i)) cnt++;
}
if(cnt!=1) return false;
return true;
}

int uporedi(string a,string b){
int i=0,j,res=a.size(),cnt=0;
for(i=a.size()-1;i>=0;i--){
    if(proveri(a,b,i)){
        if(i+b.size()<=a.size()) cnt++;
        res=i;
    }
}
//cout<<cnt<<" "<<a<<" "<<b<<endl;
if(cnt>1) return -1;
return res;
}

int Resi(int N, int K, int* L, char** A, char* S){
int i,j;
for(i=1;i<=N;i++){
    for(j=1;j<=L[i];j++) a[i]+=A[i][j];
}
for(i=1;i<=N;i++){
    for(j=1;j<=N;j++){
        if(j==i) continue;
        int tmp=uporedi(a[i],a[j]);
        if(tmp==-1) return -1;
        adj[i].push_back({j,a[i].size()-tmp});
    }
}
if(N==2){
    if(adj[1][0].second>=adj[2][0].second){
        //cout<<adj[1][0].second<<endl;
        s+='0';
        s+=a[1];
        for(i=adj[1][0].second;i<a[2].size();i++) s+=a[2][i];
    }
    else{
        s+='0';
        s+=a[2];
        for(i=adj[2][0].second;i<a[1].size();i++) s+=a[1][i];
    }
}
else return -1;
if(!proveri1(s)) return -1;
for(i=0;i<s.size();i++) S[i]=s[i];
return s.size()-1;
}