#include <bits/stdc++.h>
using namespace std;
void boost() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
}
const int N = 1e6;
const long long inf = 1e9;
int n;
vector<string> s;
string ans, cur;
vector<int> g[200];
bool was[N];
map<string, bool> wass;
void dfs(int v) {
  was[v] = 1;
  bool flag = 0;
  bool flag2 = ((int)cur.find(s[v]) > -1);
  if (!flag2) {
    for (int i = s[v].size(); i > 0; i--) {
      string t1 = s[v].substr(0, i);
      string t2 = s[v].substr(i, s[v].size() - i);
      if ((int)cur.find(t1) > -1) {
        cur += t2;
        flag = 1;
        break;
      }
    }
  }
  if (!flag && !flag2) {
    for (int i = 1; i <= s[v].size(); i++) {
      string t1 = s[v].substr(0, i);
      string t2 = s[v].substr(i, s[v].size() - i);
      if ((int)cur.find(t2) > -1) {
        cur = t1 + cur;
        break;
      }
    }
  }
  for (int i = 0; i < g[v].size(); i++) {
    if (!was[g[v][i]]) {
      dfs(g[v][i]);
    }
  }
}
bool cmp(string a, string b) { return a.size() > b.size(); }
int main() {
  boost();
  cin >> n;
  s.push_back("0");
  for (int i = 1; i <= n; i++) {
    string x;
    cin >> x;
    if (!wass.count(x)) {
      s.push_back(x);
    }
    wass[x] = 1;
  }
  n = s.size() - 1;
  sort(s.begin() + 1, s.end(), cmp);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (i != j) {
        for (int k = 0; k < s[j].size(); k++) {
          if ((int)s[i].find(s[j][k]) > -1) {
            g[i].push_back(j);
            g[j].push_back(i);
            break;
          }
        }
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    if (!was[i]) {
      cur = "";
      dfs(i);
      ans += cur;
    }
  }
  for (int i = 0; i < ans.size(); i++) {
    for (int j = 0; j < ans.size(); j++) {
      if (ans[i] == ans[j] && i != j) {
        cout << i << " " << j << endl;
      }
    }
  }
  cout << ans;
}
