#include<bits/stdc++.h>
using namespace std ;
// void comp(vector<char> &res, string str)
// {
// int j = 0;
// int i = max(0 , (int)res.size() - (int)str.length()) ;
// bool set = false;
// while(i < res.size() && j < str.length())
// {
// if(res[i] == str[j])
// {
// j++;
// set = true ;
// }
// else
// {
// if(set)
// {
// j = 0 ;
// i-- ;
// }
// set = false;
// }
// i++ ;
// }
// for(int i = j ; i < str.length() ; i++)
// res.push_back(str[i]) ;
// }
// void comp(vector<char> &res, string str)
// {
// reverse(str.begin() , str.end()) ;
// int i = res.size() - 1 ;
// int j = str.length() - 1;
// while(i >= 0 && j >= 0 &&(res[i] == str[j]))
// {
// i-- ;
// j--;
// }
// str = str.substr(0, j+1);
// for(int i = str.length() - 1 ; i >= 0 ; i--)
// res.push_back(str[i]) ;
// }
void comp(vector<char> &res , string str)
{
int t = str.length() ;
int i = max(0 , (int)res.size() - (int)str.length()) ;
vector<char> vv ;
for(auto u : str) vv.push_back(u) ;
for(i; i < res.size() ; i++)
{
vv.push_back(res[i]) ;
}
// cout << str <<endl;
int n = vv.size() ;
int arr[n] ;
arr[0] = 0 ;
i = 0 ;
for(int j = 1 ; j < n ; j++)
{
if(vv[i] == vv[j])
{
arr[j]= i +1 ;
i++ ;
}
else
{
if(i)i = arr[i-1] ;
if(vv[i] == vv[j])
{
arr[j] = i + 1 ;
i++ ;
}
else
arr[j] = 0 ;
}
}
// cout << str << endl;
// for(int i = 0 ; i < n ; i++)
// cout<< arr[i] << " " ;
// cout << endl;
if(arr[n-1] == n-1)
str = str.substr(n-t , t-(n-t)) ;
else
str = str.substr(arr[n-1] , t - arr[n-1]);
for(int i = 0 ; i < str.length(); i++)
res.push_back(str[i]) ;
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(NULL);
int n ;
cin >> n ;
string arr[n] ;
for(int i = 0 ; i < n ; i++) cin >> arr[i] ;
vector<char> vec ;
for(int i = 0 ; i < arr[0].length() ; i++) vec.push_back(arr[0][i]) ;
for(int i = 1 ; i < n ; i++)
{
comp(vec , arr[i]) ;
}
for(int i = 0 ; i < vec.size() ; i++) cout << vec[i] ;
return 0 ;
}