#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int N = 1e5 + 10;
const int M = 1e6 + 10;
const int mod = 1e9 + 7;
typedef pair<int,int>PII;
int n;
string s[N] , ans , now;
int z[M] , p[M];
void get_z(string s , string t){
int n = s.size();int m = t.size();
s = ' ' + s;t = ' ' + t;
z[1] = n;
for(int i = 2 , l = 1 , r = 0 ; i <= n ; i ++){
if(i <= r) z[i] = min(z[i - l + 1] , r - i + 1);
else z[i] = 0;
while(s[z[i] + 1] == s[i + z[i]]) z[i] += 1;
if(i + z[i] - 1 > r) l = i , r = i + z[i] - 1;
}
for(int i = 1 , l = 1 , r = 0 ; i <= m ; i ++){
if(i <= r) p[i] = min(z[i - l + 1] , r - i + 1);
else p[i] = 0;
while(p[i] + 1 <= n && i + p[i] - 1 <= m && s[p[i] + 1] == t[p[i] + i]) p[i] += 1;
if(i + p[i] - 1 > r) l = i , r = i + p[i] - 1;
}
}
signed main(){
IOS
cin >> n;
for(int i = 1 ; i <= n ; i ++) cin >> s[i];
ans += s[1];
for(int i = 1 ; i <= n - 1 ; i ++){
int x = ans.size();
int y = s[i + 1].size();
if(x > y) now = ans.substr(x - y);
else now = ans;
get_z(s[i + 1] , now);
int m = now.size();
int mx = 0;
for(int j = 1 ; j <= m ; j ++){
if(m - j + 1 == p[j]) mx = max(mx , p[j]);
}
ans += s[i + 1].substr(mx);
}
cout << ans << "\n";
return 0;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);