#include<bits/stdc++.h>
using namespace std;
#define MAXN 5005
#define INF 2147483647
int n,m=1,s,t,ans,g;
struct Edge{
int t,v,sl;
}edge[1000002];
vector<int>v[3000];
int cc[400000];
queue<int>q;
inline void reset(){
memset(cc,0,sizeof(cc));
for(int i=0;i<3000;i++) v[i].clear();
m=1;
n=s=t=ans=g=0;
return;
}
inline void input(int x,int y,int z,int t){
edge[t].t=y;
edge[t].v=z;
edge[t].sl=z;
v[x].push_back(t);
edge[t+1].t=x;
edge[t+1].v=z;
edge[t+1].sl=0;
v[y].push_back(t+1);
return;
}
inline bool bfs(){
memset(cc,-1,sizeof(cc));
while(!q.empty()) q.pop();
q.push(s);
cc[s]=0;
while(!q.empty()){
int tp=q.front();
q.pop();
for(int i=0;i<(int)v[tp].size();i++){
int tt=edge[v[tp][i]].t;
if(cc[tt]!=-1||edge[v[tp][i]].sl<=0) continue;
cc[tt]=cc[tp]+1;
q.push(tt);
if(tt==t) return 1;
}
}
return 0;
}
inline int dfs(int x,int in){
if(x==t) return in;
int sum=0;
for(int i=0;i<(int)v[x].size();i++){
int tt=edge[v[x][i]].t;
if(edge[v[x][i]].sl>0&&cc[tt]==cc[x]+1){
int k=dfs(tt,min(in,edge[v[x][i]].sl));
if(!k) cc[tt]=-1;
edge[v[x][i]].sl-=k;
edge[v[x][i]^1].sl+=k;
sum+=k;
in-=k;
}
}
return sum;
}
signed main(){
int T;
scanf("%d",&T);
while(T--){
reset();
scanf("%d",&n);
s=0,t=1;
int k=1;
int students[55];
for(int i=1;i<=n;i++,k++){
scanf("%d",&students[i]);
if(students[i]){
input(k,t,1000,m);
m+=2;
}
}
for(int i=1;i<=n;i++,k++){
int f;
scanf("%d",&f);
if(students[i]&&!f){
input(s,k,1000,m);
m+=2;g++;
}
else if(!students[i]){
input(s,k,1000,m);
m+=2;g++;
}
}
for(int i=1;i<=n;i++){
input(i+n+1,i+1,1000,m);
m+=2;
for(int j=1;j<=n;j++){
int f;
scanf("%d",&f);
if(f==1){
input(j+n,i,1000,m);
m+=2;
}
}
}
m-=2;
while(bfs()) ans+=dfs(s,INF);
if(g*1000<=ans) printf("^_^\n");
else printf("T_T\n");
}
return 0;
}