#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define maxn 60
#define maxm 6010
using namespace std;
int t,n,m,flag[maxn],head[maxn],nxt[maxm],to[maxm],cap[maxm],cnt=1,dep[maxn],cur[maxn],ans,k;
queue<int> q;
void con(int u,int v,int c){
to[++cnt]=v;
cap[cnt]=c;
nxt[cnt]=head[u];
head[u]=cnt;
}
void add(int u,int v,int c){
con(u,v,c);
con(v,u,0);
}
bool bfs(){
memset(dep,0,sizeof(dep));
dep[0]=1;
cur[0]=head[0];
q.push(0);
while(!q.empty()){
int f=q.front();
q.pop();
for(int i=head[f];i;i=nxt[i]){
int ti=to[i];
if(!dep[ti] && cap[i]){
dep[ti]=dep[f]+1;
cur[ti]=head[ti];
q.push(ti);
}
}
}
return dep[n+1];
}
int dfs(int x,int flow){
if(x==n+1 || !flow)
return flow;
int maxf=0,rest=flow;
for(int i=cur[x];i;i=nxt[i]){
int ti=to[i],res;
cur[x]=i;
if(dep[ti]==dep[x]+1 && cap[i]){
res=dfs(ti,min(rest,cap[i]));
if(res){
cap[i]-=res;
cap[i^1]+=res;
maxf+=res;
rest-=res;
if(!rest)
break;
}
}
}
return maxf;
}
int main(){
scanf("%d",&t);
for(int T=1;T<=t;T++){
cnt=ans=k=0;
memset(head,0,sizeof(head));
memset(nxt,0,sizeof(nxt));
memset(to,0,sizeof(to));
memset(cap,0,sizeof(cap));
memset(flag,0,sizeof(flag));
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&flag[i]);
add(i,n+1,flag[i]);
}
for(int i=1;i<=n;i++){
int flag_;
scanf("%d",&flag_);
if(!flag[i])
flag_=1;
add(0,i,flag_);
k+=flag_;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
scanf("%d",&flag[j]);
add(i,j,flag[j]);
}
while(bfs())
ans+=dfs(0,1e9);
if(ans==k)
printf("^_^\n");
else
printf("T_T\n");
}
}