#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
#define ll long long
using namespace std;
const int MAX=2147483647;
const int N=5e1+10;
struct node{int u, v, next;} e[2*N];
int t, n, s[N], h[N], know, need, tot, ans, hd[N], link[N];
bool cover[N];
void add(int x, int y) {e[++tot]=(node){x, y, hd[x]}; hd[x]=tot;}
int find(int x)
{
for(int i=hd[x]; i; i=e[i].next)
{
int y=e[i].v;
if(!cover[y])
{
cover[y]=1;
int q=link[y];
if(!q || find(q)) return 1;
link[y]=q;
}
}
return 0;
}
int main()
{
scanf("%d", &t);
while(t--)
{
tot=need=ans=0;
memset(hd, 0, sizeof(hd));
memset(e, 0, sizeof(e));
memset(link, 0, sizeof(link));
memset(s, 0, sizeof(s));
memset(h, 0, sizeof(h));
scanf("%d", &n);
for(int i=1; i<=n; i++) scanf("%d", &s[i]);
for(int i=1; i<=n; i++)
{
scanf("%d", &h[i]);
if(!h[i] && s[i]) add(i, i);
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
scanf("%d", &know);
if(know && s[j]) add(i, j);
}
}
for(int i=1; i<=n; i++)
if(!s[i] || (s[i] && !h[i])) need++;
for(int i=1; i<=n; i++)
if(!s[i] || (s[i] && !h[i]))
memset(cover, 0, sizeof(cover)), ans+=find(i);
if(ans == need) printf("^_^\n");
else printf("T_T\n");
}
return 0;
}