#include<bits/stdc++.h>
using namespace std;
int q,n,a[101],s,t,cnt,c,b[101],head[101],dep[101],cur[101];
const int inf=1e9+7;
struct node{
int to,nxt,val;
}edge[100010];
void add(int u,int v){
edge[++cnt]=(node){v,head[u],1};
head[u]=cnt;
edge[++cnt]=(node){u,head[v],0};
head[v]=cnt;
}
bool bfs(){
memset(dep,0,sizeof dep);
memcpy(cur,head,sizeof cur);
queue<int>q;
q.push(s);
dep[s]=1;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to;
if(dep[v]||!edge[i].val)continue;
dep[v]=dep[u]+1;
q.push(v);
}
}
return dep[t];
}
int dfs(int now,int fl){
int flow=0;
if(now==t)return fl;
for(int i=cur[now];i&&fl;i=edge[i].nxt){
cur[now]=i;
int v=edge[i].to;
if(dep[v]!=dep[now]+1||!edge[i].val)continue;
int c=dfs(v,min(fl,edge[i].val));
flow+=c,fl-=c;
edge[i].val-=c,edge[i^1].val+=c;
}
return flow;
}
int main(){
cin>>q;
while(q--){
cin>>n;
s=0,t=2*n+1,cnt=1,c=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i])add(i+n,t);
}
for(int i=1;i<=n;i++){
cin>>b[i];
if((a[i]&&b[i]==0)||!a[i])add(s,i),c++;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
int x;
cin>>x;
if(i==j||x)add(i,j+n);
}
int ans=0;
while(bfs()){
ans+=dfs(s,inf);
}
if(ans==c)puts("^_^");
else puts("T_T");
}
return 0;
}