1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include<bits/stdc++.h>
//#define int unsigned short int
//#define int long long
#define ll long long

#include <time.h>
#include <chrono>
#include <iomanip> 
  
#define BE(x) x.begin(),x.end()
#define EB(x) x.end(),x.begin()

#define st first
#define nd second

using namespace std;
using namespace std::chrono;

vector<int> algwyndlg;

/*
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
//#pragma GCC target("avx,avx2,fma")
#pragma unroll



*/





int main(){
//		ios::sync_with_stdio(false); cin.tie(NULL);
	int q;cin>>q;while(q--){
	
		int n;cin>>n;
		string now,then;
		cin>>now>>then;
		
		vector<vector<int>> G(n);
		
		for(int i=0;i<n-1;i++){
			int k1,k2;cin>>k1>>k2;k1--;k2--;
			G[k1].push_back(k2);
			G[k2].push_back(k1);
		}
		
		int l1=0;
		for(auto&x:G)if(x.size()==1)l1++;
//		cout<<"l1:"<<l1<<endl;
		vector<bool> nowB(2), thenB(2);
		for(char x:now) nowB[x-'0']=true;
		for(char x:then) thenB[x-'0']=true;
		
		auto doIt = [&](){
			if(now==then) return"TAK";
			
			if(!thenB[0]) return nowB[1]?"TAK":"NIE";
			if(!thenB[1]) return nowB[0]?"TAK":"NIE";
			if(!nowB[0]) return thenB[0]?"NIE":"TAK";
			if(!nowB[1]) return thenB[1]?"NIE":"TAK";
			
			if(l1!=2) {for(int i=0;i<n;i++) for(auto x:G[i]) if(then[i]==then[x]) return "TAK"; return "NIE";}
			
			int in=0; while(G[in].size()!=1) in++;
			int last=-1;
			int nowD=0,thenD=0;
			if(now[in]!=then[in]) thenD++;
			
			while(G[in].size()>1||last==-1){
				if(last==G[in][0])	{last=in; in=G[in][1];}
				else				{last=in; in=G[in][0];}
				if(now[in]!=now[last]) nowD++;
				if(then[in]!=then[last]) thenD++;
			}
		//	cout<<nowD<<" "<<thenD<<endl;
			if(nowD>=thenD) return "TAK";
			return "NIE";
				
		};
		
	
		cout<<doIt()<<endl;
		

	}
}