#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;


bool match(string &s1,string &s2){
    if(s1.size()<s2.size())
        return false;
    int idx=0;
    for(int i = 0; i <= s1.size()-s2.size(); i++){
        if(s1[i]==s2[0]){
            bool f=true;
            for(int j = 0; j < s2.size(); j++){
                if(s1[i+j]!=s2[j]){
                    f=false;
                    break;
                }
            }
            if(f)
                return true;
        }
    }
    return false;
}


// iツ氾板姪堋づ個陳クツ点ツづーjツづ個湘ウツ妥板づ訪ツづェツつスツづつォツづ個催渉ャツ陳キツつウツづ個閉カツ篠堋療ア
string dp[11][1<<10];
vector<string> ss;
int matchSize[11][11];
string matchStr[11][11];
int n;

string rec(int idx,int s){
    if(s==(1<<n)-1)
        return"";
    if(dp[idx][s]!="")
        return dp[idx][s];
    string res;
    for(int i = 0; i < n; i++){
        if(i==idx)continue;
        if((s>>i)&1)continue;
        int ns=s|(1<<i);
        string ts=matchStr[idx][i]+rec(i,ns);
        if(res==""||ts.size()<res.size())
            res=ts;
        else if(ts.size()==res.size()&&ts<res)
            res=ts;
    }
    return dp[idx][s]=res;
}

int main(){
    while(cin>>n&&n!=0){
        for(int i = 0; i < 11; i++)
            for(int j = 0; j < (1<<10); j++)
                dp[i][j]="";
        ss.clear();
        vector<string> tmp;
        memset(matchSize,0,sizeof(matchSize));
        for(int i = 0; i < n; i++){
            string s;
            cin>>s;
            tmp.push_back(s);
        }
        bool ok[21];
        fill(ok,ok+21,true);
        for(int i = 0; i < n; i++){
            if(!ok[i])continue;
            for(int j = 0; j < n; j++){
                if(i==j)continue;
                if(match(tmp[i],tmp[j])){
                    ok[j]=false;
                }
            }
        }
        for(int i = 0; i < n; i++)
            if(ok[i])
                ss.push_back(tmp[i]);
        n=ss.size();
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                if(i==j)
                    continue;
                matchStr[i][j]=ss[j];
                for(int k = min(ss[i].size(),ss[j].size()); k >= 1; k--){
                    if(ss[i].substr(ss[i].size()-k,k)==ss[j].substr(0,k)){
                        matchSize[i][j]=k;
                        matchStr[i][j]=ss[j].substr(k);
                        break;
                    }
                }
            }
        }
        string res;
        for(int i = 0; i < n; i++){
            string s=ss[i]+rec(i,(1<<i));
            if(res==""||s.size()<res.size())
                res=s;
            else if(s.size()==res.size()&&s<res)
                res=s;
        }
        //do{
        //    int sumSize=ss[a[0]].size();
        //    for(int i = 1; i < n; i++)
        //        sumSize+=ss[a[i]].size()-matchSize[a[i-1]][a[i]];
        //    if(maxSize>sumSize){
        //        maxSize=sumSize;
        //        // resツづーツ青カツ青ャ
        //        string s=ss[a[0]];
        //        for(int i = 1; i < n; i++)
        //            s+=matchStr[a[i-1]][a[i]];
        //        res=s;
        //    }
        //    else if(maxSize==sumSize){
        //        string s=ss[a[0]];
        //        for(int i = 1; i < n; i++)
        //            s+=matchStr[a[i-1]][a[i]];
        //        if(res>s)
        //            res=s;
        //    }
        //}while(next_permutation(a,a+n));
        cout<<res<<endl;
    }
    return 0;
}

Measured memory_bytes: 1228