#include<bits/stdc++.h>

using namespace std;

#define dbg(x) (cout<<#x<<" = "<<(x)<<'\n')

typedef long long int lld;
const int INF = (1LL << 30) - 1;
const lld LINF = (1LL << 62) - 1;
const int NMAX = 1e6;
const int CSF = 100;
const int NAICSF = CSF;

int N;
vector<string> S, T;
bitset < NMAX + 5 > bad;

bool cmp(const string &A, const string &B) {
      return A.back() == B.front();
}

int litere(const string& A) {
      int lit = 0;
      for (auto c : A)
            lit |= (1 << (c - 'a'));
      return lit;
}

vector<int> freq(const string& A) {
      vector<int> f(26);
      for (auto c : A)
            f[c - 'a']++;
      return f;
}

bool iinj(const string& A, const string& B) {
      int dp[A.size() + 5][B.size() + 5];

      if (A.size() > B.size()) return false;
      if (A.size() == B.size() && A == B) return true;
      if (A.size() == B.size() && A != B) return false;
      if ((litere(A) & litere(B)) != litere(A)) return false;

      vector<int> p = freq(A);
      vector<int> q = freq(B);
      for (int i = 0; i < 26; i++)
            if (p[i] > q[i]) return false;

      for (int i = 0; i < (int)A.size(); i++)
            for (int j = 0; j < (int)B.size(); j++) {
                  dp[i][j] = 0;
                  if (i >= 1) dp[i][j] = max(dp[i][j], dp[i - 1][j]);
                  if (j >= 1) dp[i][j] = max(dp[i][j], dp[i][j - 1]);
                  if (A[i] == B[j]) dp[i][j] = max(dp[i][j], (i >= 1 && j >= 1) * dp[i - 1][j - 1] + 1);
            }

      return dp[A.size() - 1][B.size() - 1] == (int)A.size();
}

int main() {
      cin.sync_with_stdio(false);

      #ifndef ONLINE_JUDGE
      freopen("input.txt", "r", stdin);
      freopen("output.txt", "w", stdout);
      #endif

      for (string s; cin >> s; )
            S.push_back(s);

      N = S.size();

      for (int i = 0; i < N; i++) {
            for (int j = max(0, i - CSF); !bad[i] && j <= min(N - 1, i + NAICSF); j++) {
                  if (i != j && iinj(S[i], S[j]))
                        bad[i] = 1;
                  // dbg(S[i]);
                  // dbg(S[j]);
                  // dbg(iinj(S[i], S[j]));
            }
      }

      for (int i = 0; i < N; i++)
            if (!bad[i])
                  T.push_back(S[i]);

      srand(clock());
      random_shuffle(T.begin(), T.end());
      sort(T.begin(), T.end(), cmp);

      for (int i = 0; i < (int)T.size(); i++) {
            int j = 0;
            while (i + 1 < (int)T.size() && !T[i].empty() && T[i].back() == T[i + 1][j++])
                  T[i].pop_back();
      }

      for (auto t : T)
            cout << t;
      cout << endl;

      return 0;
}