#include 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 S, T; bitset < NMAX + 5 > bad; bool cmp(const string &A, const string &B) { return A.back() == B.front(); } lld litere(const string& A) { lld lit = 0; for (auto c : A) if ('a' <= c && c <= 'z') lit |= (1LL << (c - 'a')); else lit |= (1LL << (c - 'A' + 26)); return lit; } vector freq(const string& A) { vector f(26 * 2); for (auto c : A) if ('a' <= c && c <= 'z') f[c - 'a']++; else f[c - 'A' + 26]++; 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 p = freq(A); vector q = freq(B); for (int i = 0; i < 52; 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; }