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
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#define rep(i,poczatek,koniec)  for(__typeof(koniec) i = poczatek; i<=koniec; ++i)
#define repr(i,poczatek,koniec) for(__typeof(koniec) i = poczatek; i>=koniec; --i)
#define pb push_back
#define pob pop_back
#define eb emplace_back
#define pf push_front
#define pof pop_front
#define st first
#define nd second
#define bend(X) X.begin(),X.end()
#define sz(X) (int(X.size()))
#define graph vector<node>
#define print cout<<
#ifdef LOCAL
#define nl endl
#define dbg(x) cout << #x << " = " << x << ' ';
#define say(x) cout << x
#else
#define nl '\n'
#define dbg(x)
#define say(x)
#endif

using namespace std;
using namespace __gnu_pbds;

using ll 	= long long;
using ull 	= unsigned long long;
using ld 	= long double;
using pii 	= pair<int,int>;
using pll 	= pair<ll,ll>;
using pli	= pair<ll,int>;
using vb 	= vector<bool>;
using vc 	= vector<char>;
using vi 	= vector<int>;
using vl 	= vector<ll>;
using vpi 	= vector<pii>;
using vpl	= vector<pll>;
using vvi	= vector<vi>;
using vvl 	= vector<vl>;
using vvb	= vector<vb>;

template <typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;

template<typename T1, typename T2> istream& operator>>(istream& is, pair<T1,T2>& x){
	is >> x.st >> x.nd;
	return is;
}
template<typename T1, typename T2> ostream& operator<<(ostream& os, pair<T1,T2>& x){
	os << '(' << x.st << ',' << x.nd << ')';
	return os;
}
template<typename T> istream& operator>>(istream& is, vector<T>& x){
	for(T& i : x)is >> i;
	return is;
}
template<typename T> ostream& operator<<(ostream& os, vector<T> x){
	for(T& i : x)os << i << ' ';
	return os;
}
template<typename T1, typename T2> pair<T1,T2> operator+(const pair<T1,T2>& A, const pair<T1,T2>& B){
	return {A.st + B.st, A.nd + B.nd}; 
}
template<typename T1, typename T2> pair<T1,T2> operator-(const pair<T1,T2>& A, const pair<T1,T2>& B){
	return {A.st - B.st, A.nd - B.nd}; 
}
template<typename T1, typename T2> pair<T1,T2> operator-(const pair<T1,T2>& A){
	return {-A.st, -A.nd};
}
template<typename T1, typename T2> void mine(T1& A, const T2& B){if(B < A) A = B;}
template<typename T1, typename T2> void maxe(T1& A, const T2& B){if(B > A) A = B;}

const int INF 	= (int)2e9;
const ll INFll 	= (ll)9e18;
const int MOD 	= (int)1e9+7;

int R(int pocz, int kon){
	return (rand()%(kon-pocz+1) + pocz);
}

ll RR(ll pocz, ll kon){
	return ((ll((rand()) << 30) + rand())/(kon-pocz+1) + pocz);
}

void fastDataTransfer(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
}

int n, m, a, b, c, d, q, k;
vi V[4];
string A,B;

void read(){
	cin>>n>>A>>B;
}

void solve(){
	rep(i,0,3)
		V[i].resize(30);
	for(int i=0;i<n;i+=2){
		V[0][A[i]-'a']++;
		V[1][B[i]-'a']++;
	}
	for(int i=1;i<n;i+=2){
		V[2][A[i]-'a']++;
		V[3][B[i]-'a']++;
	}
	
	if(V[0]==V[1] && V[2]==V[3])
		print "TAK" << nl;
	else
		print "NIE" << nl;
}

int main(){
	fastDataTransfer();
	int testCases = 1;
//	cin >> testCases;
	rep(testNumber, 1, testCases){
		read();
		solve();
	}
}