#include<bits/stdc++.h>
using namespace std;
#define INF "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"

string chmin( string a, string b){
  if(a.size() != b.size()) return (a.size() < b.size() ? a : b);
  return (a < b ? a : b);
}

int main(){
  string dp1[10][10],dp2[10][1 << 10];
  int n;
  vector< string > str;

  while( cin >> n, n){
    fill_n( *dp1, 10 * 10, INF);
    fill_n( *dp2, 10 * 1 << 10, INF);
    str.resize(n);
    for(int i = 0; i < n; i++){
      cin >> str[i];
    }
    unsigned bit = 0u;
    for(int i = 0; i < n; i++){
      for(int j = 0; j < n; j++){
        if(i == j || (bit >> i) & 1 || (bit >> j) & 1) continue;
        if(str[i].find(str[j]) != string::npos) bit |= 1 << j;
      }
    }
  
    for(int i = 0; i < n; i++){
      for(int j = 0; j < n; j++){
        if(i == j) continue;
        dp1[i][j] = str[j];
        if((bit >> i) & 1 || (bit >> j) & 1) continue;
        for(int k = 0; k < str[i].size(); k++){
          if(str[i].substr(k) == str[j].substr(0, str[i].substr(k).size())){
            dp1[i][j] = str[j].substr(str[i].substr(k).size());
            break;
          }
        }
      }
    }
  
    for(int i = 0; i < n; i++){
      dp2[i][bit|(1 << i)] = str[i];
    }
    for(int i = 0; i < 1 << n; i++){
      for(int j = 0; j < n; j++){
        if(dp2[j][i|bit] == INF) continue;
        for(int k = 0; k < n; k++){
          if(j == k || ((i|bit) >> k) & 1) continue; //mumumu??
          dp2[k][i|bit|(1 << k)] = chmin( dp2[k][i|bit|(1 << k)], dp2[j][i|bit] + dp1[j][k]);
        }
      }
    }
    string ret = INF;
    for(int i = 0; i < n; i++){
      ret = chmin( ret, dp2[i][(1 << n) - 1]);
    }
  
    cout << ret << endl;
  }
}