#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include template inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } //constexpr long long MAX = 5100000; constexpr long long INF = 1LL << 60; constexpr int inf = 1000000007; constexpr long long mod = 1000000007LL; //constexpr long long mod = 998244353LL; const long double PI = acos((long double)(-1)); using namespace std; typedef unsigned long long ull; typedef long long ll; typedef long double ld; int main() { cin.tie(nullptr); ios::sync_with_stdio(false); int n; cin >> n; vector vs(n); for (int i = 0; i < n; i++) cin >> vs[i]; string uni; for (int i = 0; i < 51; i++) uni += 'z'; vector, greater<>>> vpq(26); int kkt = 0; for (int i = 0; i < n; i++) { kkt += vs[i].size(); if (vs[i].size() > 1) vpq[vs[i][0] - 'a'].emplace(vs[i].substr(1, (int)vs[i].size() - 1)); else vpq[vs[i][0] - 'a'].emplace(uni); } string res; while (kkt--) { for (int i = 0; i < 26; i++) { if (!vpq[i].empty()) { string s = vpq[i].top(); vpq[i].pop(); res += (char)('a' + i); if (s == uni) break; if (s.size() > 1) { vpq[s[0] - 'a'].emplace(s.substr(1, (int)s.size() - 1)); } else if (s.size() == 1) vpq[s[0] - 'a'].emplace(uni); break; } } } cout << res << endl; return 0; }