#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <iostream>
using namespace std;
const int N = 150,M = N * N ,INF = 1e9;
int h[N],e[M],ne[M],idx;
long long f[M];
int q[N],d[N],cur[N];
int n,S,T;
int a[N],b[N];
void add(int a, int b, int c)
{
e[idx] = b, f[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
e[idx] = a, f[idx] = c, ne[idx] = h[b], h[b] = idx ++ ;
}
bool bfs()
{
int hh = 0, tt = 0;
memset(d, -1, sizeof d);
q[0] = S, d[S] = 0, cur[S] = h[S];
while (hh <= tt)
{
int t = q[hh ++ ];
for (int i = h[t]; ~i; i = ne[i])
{
int ver = e[i];
if (d[ver] == -1 && f[i])
{
d[ver] = d[t] + 1;
cur[ver] = h[ver];
if (ver == T) return true;
q[ ++ tt] = ver;
}
}
}
return false;
}
long long find(int u, long long limit)
{
if (u == T) return limit;
long long flow = 0;
for (int i = cur[u]; ~i && flow < limit; i = ne[i])
{
cur[u] = i;
int ver = e[i];
if (d[ver] == d[u] + 1 && f[i])
{
int t = find(ver, min(f[i], limit - flow));
if (!t) d[ver] = -1;
f[i] -= t, f[i ^ 1] += t, flow += t;
}
}
return flow;
}
long long dinic()
{
long long r = 0, flow;
while (bfs()) while (flow = find(S, INF)) r += flow;
return r;
}
int main()
{
int cases;
cin >> cases;
while(cases --)
{
cin >> n;
memset(h,-1,sizeof h);
idx = 0;
S = 0, T = 2 * n + 10;
for(int i = 1; i <= n; i ++)
{
cin >> a[i];
if(a[i] == 1) add(i + n,T,1);
}
int tot = 0;
for(int i = 1; i <= n; i ++)
{
cin >> b[i];
if((a[i] == 1 && b[i] == 0) || a[i] == 0)
{
add(S,i,1);
tot ++;
}
}
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
{
int x;
cin >> x;
if(x == 1 || i == j)
{
add(i,n + j,1);
}
}
if(dinic() >= tot) puts("^_^");
else puts("T_T");
}
}