/*
2
2
lubenwei
niubi
3
aa
ab
abb
lubenweiubi
aabb
*/
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
const int MAXL=1000005,SIGMA=26;
char s[MAXL],ans[MAXL];
set <int> pos[SIGMA];
void solve(){
int n;
scanf("%d%s",&n,s);
memcpy(ans,s,sizeof(s));
int l=strlen(s);
for (int i=0;i<SIGMA;i++)
pos[i].clear();
for (int i=0;i<l;i++)
pos[s[i]-'a'].insert(i);
int cnt=l;
for (int i=1;i<n;i++){
scanf("%s",s);
l=strlen(s);
int now=-1;
for (int j=0;j<l;j++){
int c=s[j]-'a';
auto k=pos[c].upper_bound(now);
if (k==pos[c].end()){
for (int t=j;t<l;t++){
pos[s[t]-'a'].insert(cnt);
ans[cnt++]=s[t];
}
break;
}
now=*k;
}
}
for (int i=0;i<cnt;i++)
printf("%c",ans[i]);
puts("");
}
int main(){
int T;
scanf("%d",&T);
while (T--) solve();
return 0;
}
upper_bound
https://blog.csdn.net/naipp/article/details/52915573