#include <bits/stdc++.h>
using namespace std;
const int MAXN = 105;
int n;
string s[MAXN];
string ans = "";
vector<int> g[MAXN];
bool has[MAXN];
bool used[MAXN];
vector<int> tp;
void dfs(int v) {
  used[v] = true;
  for (int i = 0; i < g[v].size(); i++) {
    int to = g[v][i];
    if (!used[to]) dfs(to);
  }
  tp.push_back(v);
}
void dfs2(int v) {
  used[v] = true;
  ans.append(1, (char)('a' + v));
  for (int i = 0; i < (int)g[v].size(); i++) {
    int to = g[v][i];
    if (!used[to]) dfs2(to);
  }
}
int main() {
  scanf("%d\n", &n);
  for (int i = 1; i <= n; i++) {
    getline(cin, s[i]);
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < s[i].length(); j++) {
      has[s[i][j] - 'a'] = true;
      if (j + 1 < s[i].length()) {
        int from = s[i][j] - 'a';
        int to = s[i][j + 1] - 'a';
        g[from].push_back(to);
      }
    }
  }
  for (int i = 0; i < 26; i++) {
    if (has[i] && !used[i]) {
      dfs(i);
    }
  }
  reverse(tp.begin(), tp.end());
  memset(used, false, sizeof(used));
  for (int i = 0; i < (int)tp.size(); i++) {
    int cur = tp[i];
    if (!used[cur]) dfs2(cur);
  }
  cout << ans << endl;
  return 0;
}
