#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>//亲亲
using namespace std;
#define N 1100
#define M 100010
#define INF 0x3f3f3f3f3f3f3f3f
long long hhk,s,t,n,sum,mmax,a[N][N],b[N],c[N],d[M],cur[M],First[M],tot=-1;
struct fun
{
long long v,w,Next;
}e[M];
inline long long read()
{
long long wjl=0,jia=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')jia*=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
wjl=(wjl<<1)+(wjl<<3)+(ch^48);
ch=getchar();
}
return wjl*jia;
}
inline void add(long long x,long long y,long long z)
{
e[++tot].v=y;
e[tot].Next=First[x];
e[tot].w=z;
First[x]=tot;
e[++tot].v=x;
e[tot].w=0;
e[tot].Next=First[y];
First[y]=tot;
}
bool bfs()
{
memset(d,-1,sizeof(d));
queue<int>q;
q.push(s);
d[s]=1;
while(!q.empty())
{
long long u=q.front();
q.pop();
for(long long i=First[u];~i;i=e[i].Next)
{
long long v=e[i].v,w=e[i].w;
if(d[v]==-1&&w)
{
d[v]=d[u]+1;
q.push(v);
}
}
}
return d[t]!=-1;
}
long long dfs(long long x,long long t,long long minf)
{
if(x==t||minf==0)return minf;
long long f,flow=0;
for(long long i=cur[x];~i;i=e[i].Next)
{
long long y=e[i].v,z=e[i].w;
cur[x]=i;
if(z&&d[y]==d[x]+1)
{
long long f=dfs(y,t,min(minf,z));
if(f)
{
minf-=f;
flow+=f;
e[i].w-=f;
e[i^1].w+=f;
if(minf==0)return flow;
}
}
}
return flow;
}
void dinic()
{
while(bfs())
{
for(long long i=1;i<=t;i++)cur[i]=First[i];
mmax+=dfs(s,t,INF);
}
}
int main ()
{
hhk=read();
while(hhk--)
{
n=read();
s=2*n+1,t=2*n+2;
tot=-1,sum=0,mmax=0;
memset(First,-1,sizeof(First));
for(long long i=1;i<=n;i++)//是否有床
{
b[i]=read();
if(b[i])add(n+i,t,1);
}
for(long long i=1;i<=n;i++)//是否在这里住
{
c[i]=read();
if((!c[i]&&b[i])||b[i]==0)add(s,i,1),sum++;
}
for(long long i=1;i<=n;i++)
{
for(long long j=1;j<=n;j++)
{
long long o=read();
if(i==j||o)add(i,j+n,INF);//只需要单向的
}
}
if(mmax>=sum)printf("^_^\n");
else printf("T_T\n");
}
return 0;
}