水
#include<bits/stdc++.h>
using namespace std;
const int N=2e4+10,M=2e4+10,inf=1<<30;
int ans,A[N],B[N];
struct DINIC{
int Next[M],d[N],head[N],ver[M],edge[M],tot,S,T;
queue<int> q;
void add(int x,int y,int z){
ver[++tot]=y,edge[tot]=z,Next[tot]=head[x],head[x]=tot;
ver[++tot]=x,edge[tot]=0,Next[tot]=head[y],head[y]=tot;
}
void build(){
memset(head,0,sizeof head);
tot=1,S=N-2,T=N-1,ans=0;
int n,x;cin>>n;
for(int i=1;i<=n;++i)scanf("%d",&A[i]);
for(int i=1;i<=n;++i)scanf("%d",&B[i]);
for(int i=1;i<=n;++i){
if(A[i]==1&&B[i]==1)add(i+n,T,1);
if(A[i]==1&&B[i]==0)add(S,i,1),add(i,i+n,1),add(i+n,T,1),++ans;
if(A[i]==0)add(S,i,1),++ans;
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
scanf("%d",&x);
if(x)add(i,j+n,1);
}
}
}
bool bfs(){
memset(d,0,sizeof d);
while(q.size())q.pop();
q.push(S);d[S]=1;
while(q.size()){
int x=q.front();q.pop();
for(int i=head[x];i;i=Next[i])
if(edge[i]&&!d[ver[i]]){
q.push(ver[i]);
d[ver[i]]=d[x]+1;
if(ver[i]==T)return 1;
}
}
return 0;
}
int find(int x,int flow){
if(x==T)return flow;
int rest=flow,k;
for(int i=head[x];i&&rest;i=Next[i])
if(edge[i]&&d[ver[i]]==d[x]+1){
k=find(ver[i],min(rest,edge[i]));
if(!k)d[ver[i]]=0;
edge[i]-=k;
edge[i^1]+=k;
rest-=k;
}
return flow-rest;
}
int dinic(){
int flow=0,maxflow=0;
while(bfs())
while(flow=find(S,inf))maxflow+=flow;
return maxflow;
}
}G;
int main(){
int T;
cin>>T;
while(T--){
G.build();
if(ans==G.dinic())cout<<"^_^"<<endl;
else cout<<"T_T"<<endl;
}
}