#ifndef ONLINE_JUDGE
#include"word.h"
#endif
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i(a);i<=(b);++i)
#define req(i,a,b) for(int i(a);i>=(b);--i)
using namespace std;
string wds[10001],allvalid[10001],lst,t;
int allvalidnum[10001];
long long w[10001];
int vis[10001];
int ns;
mt19937 rnd(time(0));
int iv[27]={},ps,sz,vl[27],vv[27];
int cnt[27]={},ap[27],pr[27];
long long w3[10001];
int GOLD[5],SILVER[27];
vector<int> forbidpos[27];
const string first_guess[26]={"slier","lares","lares","tores","tarns","arles","lares","lares","snare","ousel","ranis","nares","tares","aides","tries","lares","raise","aides","plate","nares","snare","riles","nares","cones","kanes","aeons"};
const int fp[26]={7009,4224,4224,7898,7615,383,4224,4224,7078,5407,6132,5086,7613,148,7974,4224,6105,148,5748,5086,7078,6347,5086,1561,3972,99};
const char *guess(int num_testcase, int remaining_guesses, char initial_letter, bool *gold, bool *silver)
{
if(remaining_guesses==5)
{
memset(vis,0,sizeof vis),memset(iv,0,sizeof iv),memset(vv,0,sizeof vv),memset(vl,0,sizeof vl),memset(GOLD,0,sizeof GOLD),memset(SILVER,0,sizeof SILVER);
rep(i,0,25) forbidpos[i].clear();
lst=first_guess[initial_letter-97];
vis[fp[initial_letter-97]]=1;
return first_guess[initial_letter-97].c_str();
}
rep(i,0,4) if(gold[i]) GOLD[i]=lst[i];
rep(i,0,4) if(silver[i])
{
SILVER[lst[i]-97]=1;
forbidpos[lst[i]-97].emplace_back(i);
}
rep(i,1,sz) allvalid[i]="",allvalidnum[i]=0,w[i]=0;
sz=0;
t=" ";t[0]=initial_letter;
ps=lower_bound(wds+1,wds+ns+1,t)-wds;
memset(ap,0,sizeof ap);
memset(pr,0,sizeof pr);
rep(i,0,4)
{
pr[lst[i]-97]=1;
if(gold[i]) ++ap[lst[i]-97],vl[lst[i]-97]=vv[lst[i]-97]=1;
if(silver[i]) ++ap[lst[i]-97],vl[lst[i]-97]=1;
}
rep(i,0,25) if(!ap[i]&&pr[i]) iv[i]=1;
while(wds[ps][0]==initial_letter)
{
int ok=1;
if(!vis[ps])
{
rep(i,0,4) if(iv[wds[ps][i]-97]){ok=0;break;}
if(ok)
{
rep(i,0,4) if(GOLD[i]==wds[ps][i]);else if(GOLD[i]){ok=0;break;}
if(ok)
{
memset(cnt,0,sizeof cnt);
rep(i,0,26) if(SILVER[i]) cnt[i]=1;
rep(i,0,4) if(cnt[wds[ps][i]-97]) --cnt[wds[ps][i]-97];
rep(i,0,26) if(cnt[i]) {ok=0;break;}
if(ok)
{
rep(i,0,4)
{
for(auto x:forbidpos[wds[ps][i]-97]) if(x==i){ok=0;break;}
if(!ok) break;
}
}
}
}
}
else ok=0;
if(ok)
{
allvalid[++sz]=wds[ps];
allvalidnum[sz]=ps;
}
++ps;
}
rep(i,1,sz)
{
for(auto x:allvalid[i])
{
if(!iv[x-97]&&!vl[x-97])
{
rep(j,1,sz) if(allvalid[j].find(x)!=-1) w[i]+=10;
}
}
w[i]+=20;
}
memset(w3,0,sizeof w3);
rep(i,1,ns)
{
for(auto x:wds[i])
{
if(!iv[x-97]&&!vl[x-97])
{
rep(j,1,sz) if(allvalid[j].find(x)!=-1) w3[i]+=10;
}
}
}
long long T=1,mxw=w[1],tp=1;
rep(i,2,sz) if(w[i]>mxw) mxw=w[i],T=i;
if(remaining_guesses==3) rep(i,1,ns) if(w3[i]>mxw) mxw=w3[i],T=i,tp=2;
if(tp==1)
{
vis[allvalidnum[T]]=1;
lst=allvalid[T];
return allvalid[T].c_str();
}
else
{
vis[T]=1;
lst=wds[T];
return lst.c_str();
}
}
void init(int num_scramble, const char *scramble)
{
ns=num_scramble;
rep(i,1,num_scramble)
{
wds[i]="";
int psl=i*5-5,psr=psl+4;
rep(ps,psl,psr) wds[i]+=scramble[ps];
}
wds[ns+1]="!!!!!";
}