#include <bits/stdc++.h>
using namespace std;

#define dump(...) cout<<"# "<<#__VA_ARGS__<<'='<<(__VA_ARGS__)<<endl
#define repi(i,a,b) for(int i=int(a);i<int(b);i++)
#define peri(i,a,b) for(int i=int(b);i-->int(a);)
#define rep(i,n) repi(i,0,n)
#define per(i,n) peri(i,0,n)
#define all(c) begin(c),end(c)
#define mp make_pair
#define mt make_tuple

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<string> vs;

constexpr int INF=1e9;
constexpr int MOD=1e9+7;
constexpr double EPS=1e-9;

template<typename T1,typename T2>
ostream& operator<<(ostream& os,const pair<T1,T2>& p){
	return os<<'('<<p.first<<','<<p.second<<')';
}
template<typename Ostream,typename Container>
Ostream& operator<<(Ostream& os,const Container& c){
	os<<'[';
	for(auto i=begin(c);i!=end(c);++i)
		os<<(i==begin(c)?"":" ")<<*i;
	return os<<']';
}

struct UnionFind{
	vi data;
	UnionFind(int n):data(n,-1){}
	int Find(int i){
		return data[i]<0?i:(data[i]=Find(data[i]));
	}
	bool Unite(int a,int b){
		a=Find(a),b=Find(b);
		if(a==b) return false;
		if(-data[a]<-data[b]) swap(a,b);
		data[a]+=data[b];
		data[b]=a;
		return true;
	}
	int Size(int i){
		return -data[Find(i)];
	}
	int Size(){
		int res=0;
		for(int x:data) res+=x<0;
		return res;
	}
};

bool win(const vvi& g,UnionFind uf,map<vvi,bool>& memo)
{
	if(memo.count(g)) return memo[g];
	int n=g.size();
	rep(i,n) repi(j,i+1,n) if(!g[i][j]){
		if(uf.Find(i)==uf.Find(j) || uf.Size()>2){
			vvi g2=g; g2[i][j]=g2[j][i]=1;
			UnionFind uf2=uf; uf2.Unite(i,j);
			if(!win(g2,uf2,memo)) return memo[g]=true;
		}
	}
	return memo[g]=false;
}

string solve_naive(vvi g)
{
	int n=g.size();
	UnionFind uf(n);
	rep(i,n) repi(j,i+1,n) if(g[i][j]) uf.Unite(i,j);
	map<vvi,bool> memo;
	return win(g,uf,memo)?"Taro":"Hanako";
}

void dfs(const vvi& g,int u,int x,vi& vis)
{
	int n=g.size();
	vis[u]=x;
	rep(v,n) if(g[u][v] && vis[v]==-1)
		dfs(g,v,x,vis);
}

string solve(vvi g)
{
	int n=g.size();
	
	if(n&1){
		int cnt=0;
		rep(i,n) repi(j,i+1,n) cnt+=g[i][j];
		return (n*(n-1)/2-cnt)%2?"Taro":"Hanako";
	}
	
	vvi ccs;
	{
		vi vis(n,-1);
		int cnt=0;
		rep(i,n) if(vis[i]==-1)
			dfs(g,i,cnt++,vis);
		ccs.resize(cnt);
		rep(i,n) ccs[vis[i]].push_back(i);
	}
	
	int cnt=0;
	rep(i,n) repi(j,i+1,n) cnt+=g[i][j];
	int rest=n*(n-1)/2-cnt;
	
	int odd=0,even=0;
	rep(i,ccs.size()) (ccs[i].size()&1?odd:even)++;
	
	assert(odd%2==0);
	if(odd==0)
		return rest&1?"Taro":"Hanako";
	else if(odd==2){
		if(even==0)
			return rest&1?"Hanako":"Taro";
		else if(even==1)
			return "Taro";
		else
			return rest&1?"Taro":"Hanako";
	}
	else
		return rest&1?"Taro":"Hanako";
}

bool test()
{
	int n=6;
	rep(b,1<<n*(n-1)/2){
		printf("%d/%d\n",b,1<<n*(n-1)/2);
		vvi g(n,vi(n));
		int k=0;
		rep(i,n) repi(j,i+1,n){
			g[i][j]=g[j][i]=b>>k&1;
			k++;
		}
		string res=solve(g);
		string ans=solve_naive(g);
		if(res!=ans){
			rep(i,n) cout<<g[i]<<endl;
			dump(res); dump(ans);
			return false;
		}
	}
	return true;
}

int main()
{
	//dump(test());
	
	for(int n;cin>>n && n;){
		vvi g(n,vi(n));
		rep(i,n){
			string s; cin>>s;
			rep(j,n) g[i][j]=s[j]=='Y';
		}
		
		cout<<solve(g)<<endl;
	}
}

Measured memory_bytes: 9180