#include using namespace std; #define ll long long const ll maxn=20005; ll ans[maxn+5],nxt[maxn+5]; bool elim[maxn+5]; vector s,next_s; ll ask(ll i,ll j){ printf("1 %lld %lld\n",i,j); fflush(stdout); ll res; scanf("%lld",&res); return res; } int main(){ ll t,n,i,j,k,res,u,v,cnt; mt19937 rng(1337); scanf("%lld",&t); while(t--){ scanf("%lld",&n); for(i=1;i<=n;i++) elim[i]=false,ans[i]=0; s.clear(); for(i=1;i<=n;i++) s.push_back(i); while(s.size()>2){ shuffle(s.begin(),s.end(),rng); next_s.clear(); vector> pairs; for(i=0;i+12) break; } ll node1=-1,node2=-1; if(s.size()==2){ node1=s[0];node2=s[1]; }else{ ll p1=s[0],p2=s[1],p3=s[2]; ll r1=ask(p1,p2),r2=ask(p1,p3); if(r1!=-1){node1=p1;node2=p2;} else if(r2!=-1){node1=p1;node2=p3;} else{node1=p2;node2=p3;} } ll A=node1,B=node2; ll C=ask(A,B); ll X=ask(A,C); ll Y=ask(B,C); ll Z=ask(A,X); ll real_1,real_2; if(Y==Z){real_1=A;real_2=B;} else{real_1=B;real_2=A;} ans[real_1]=1;ans[real_2]=2; ll cur=real_2; for(i=3;i<=n;i++){ ll nxt_val=ask(real_1,cur); ans[nxt_val]=i; cur=nxt_val; } printf("2"); for(i=1;i<=n;i++) printf(" %lld",ans[i]); printf("\n"); fflush(stdout); } return 0; }