#include<iostream>
#include<cstring>
using namespace std;
const int INF=101;

int count(char *front,int fn,char *back,int bn){
	char *p=&front[fn-bn];
	if(p<front)p=front;
	int n= &front[fn]-p;
	for(;*p!='\0';p++){
		if(strncmp(p,back,n)==0)return n;
		n--;
	}
	return 0;
}
bool substr(char *a,char *b){
	int n=strlen(a);
	for(;*b!='\0';b++){
		if(strncmp(a,b,n)==0)return true;
	}
	return false;
}
int delete_substr(char str[][10+1],int n,bool flag[]){
	for(int i=0;i<n;i++){
		if(flag[i]){
			for(int j=i+1;j<n;j++){
				strcpy(str[j-1],str[j]);
				flag[j-1]=flag[j];
			}
			i--;
			n--;
		}
	}
	return n;
}
int main(){
	char str[10][10+1];
	int str_len[10];
	static char dp[1<<10][10][10*10+1];
	int len[1<<10][10];
	int n;
	bool flag[10];
	while(cin>>n, n){
		memset(flag,false,sizeof(flag));
		for(int i=0;i<n;i++){
			cin>>str[i];
			for(int j=0;j<i;j++){
				if(substr(str[j],str[i])){
					flag[j]=true;
				}
				else if(substr(str[i],str[j])){
					flag[i]=true;
				}
			}
		}
		n= delete_substr(str,n,flag);
		for(int i=0;i<n;i++){
			str_len[i]=strlen(str[i]);
		}
		for(int i=0;i<(1<<n);i++){
			for(int j=0;j<n;j++){
				len[i][j]=INF;
				dp[i][j][0]='\0';
			}
		}
		for(int i=1;i<(1<<n);i++){
			for(int j=0;j<n;j++){
				if(!(i&1<<j))continue;
				int pre= i&~(1<<j);
				if(pre==0){//空文字列
					len[1<<j][j]=str_len[j];
					strcpy(dp[1<<j][j],str[j]);
					break;
				}
				for(int k=0;k<n;k++){
					if(!(pre&1<<k))continue;
					int tmp= count(str[k],str_len[k],str[j],str_len[j]);
					int l= len[pre][k]+str_len[j]-tmp;
					char s[101];
					if(len[i][j] < l)continue;
					strcpy(s,dp[pre][k]);
					strcat(s,str[j]+tmp);
					if(l < len[i][j] || l==len[i][j]&&strcmp(s,dp[i][j])<0){
						len[i][j]= l;
						strcpy(dp[i][j],s);
					}
				}
			}
		}
		int min=0;
		for(int i=1;i<n;i++){
			if(len[(1<<n)-1][i]<len[(1<<n)-1][min]
				|| len[(1<<n)-1][i]==len[(1<<n)-1][min] && strcmp(dp[(1<<n)-1][i],dp[(1<<n)-1][min])<0){
				min=i;
			}
		}
		cout<<dp[(1<<n)-1][min]<<endl;
	}
}