#include<bits/stdc++.h>
using namespace std;
const int N=4e3+5,M=15;
int m,n,v,a[N],p,l,r,ok,len,vis[M],tot=1,ch[N][M],f[N][1<<12],val[N],fail[N],mx;
char s[N];
pair<int,int>pre[N][1<<12];
queue<int>q;
void insert(){
int p=1,k;
for(int i=l;i<=r;i++){
if(!ch[p][k=a[i]]) ch[p][k]=++tot;
p=ch[p][k];
}
val[p]+=v;
}
void getfail(){
fill(ch[0],ch[0]+12,1),q.push(1);
while(q.size()){
int x=q.front(),y;
val[x]+=val[fail[x]],q.pop();
for(int i=0;i<12;i++){
if((y=ch[x][i])) fail[y]=ch[fail[x]][i],q.push(y);
else ch[x][i]=ch[fail[x]][i];
}
}
}
void dfs(int y,int t){
if(!t) return ;
auto p=pre[y][t];
int x=p.first,i=p.second,s=t^(1<<i);
dfs(x,s),putchar(i+'a');
}
signed main(){
scanf("%d",&m);
while(m--){
scanf("%d%s",&v,s+1),n=strlen(s+1),p=l=r=12,ok=1;
fill(vis,vis+12,0),fill(a+1,a+1+23,-1);
for(int i=1;i<=n&&ok;i++){
int k=s[i]-'a';
if(i==1) a[p]=k;
else if(vis[k]) a[p-1]==k?p--:(a[p+1]==k?p++:ok=0);
else p==l?a[l=--p]=k:(p==r?a[r=++p]=k:ok=0);
vis[k]=1;
}
if(!ok) continue;
insert();
if(r-l+1>1) reverse(a+l,a+1+r),insert();
}
getfail();
memset(f,-0x3f,sizeof(f)),f[1][0]=0;
for(int s=0;s<(1<<12);s++)
for(int x=1;x<=tot;x++) if(f[x][s]>=0)
for(int i=0;i<12;i++) if(!(s>>i&1)){
int y=ch[x][i],t=s|(1<<i),tmp;
if((tmp=f[x][s]+val[y])>f[y][t]) f[y][t]=tmp,pre[y][t]={x,i};
}
for(int i=1;i<=tot;i++)
if(f[i][(1<<12)-1]>f[mx][(1<<12)-1]) mx=i;
dfs(mx,(1<<12)-1);
return 0;
}