#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(int)(n);i++)
using namespace std;
typedef vector<int> vi;

class UF{
  vi p,r;

public:
  UF(int n):p(n,-1),r(n,0){ }

  inline int find(int x){ return (p[x]<0)?x:(p[x] = find(p[x])); }

  inline void unite(int x,int y){
    x = find(x); y = find(y);
    if(x==y)return;

    if(r[x] < r[y])p[x] = y;
    else p[y] = x;
    if(r[x] == r[y])r[x]++;
  }

  inline bool same(int x,int y){return find(x)==find(y);}
};

int memo[1001][1001][2];

inline int rec(int odd, int even, int edges){
  if(memo[odd][even][edges]>=0)return memo[odd][even][edges];
  if(odd + even == 2)return edges;

  int &res = memo[odd][even][edges];
  if(edges && !rec(odd, even, 1-edges))return res=1;
  if(odd && even && !rec(odd, even-1, 1-edges))return res=1;
  if(odd >= 2 && !rec(odd-2, even+1, edges))return res=1;
  if(even >= 2 && !rec(odd, even-1, 1-edges))return res=1;

  return res = 0;
}

int main(){
  int n;
  scanf("%d",&n);
  UF uf(n);

  char s[1010];
  int num = 0;
  rep(i,n){
    scanf("%s",s);
    rep(j,i)if(s[j] == 'Y')uf.unite(i,j), num--;
  }

  vi card(n,0);
  rep(i,n)card[uf.find(i)]++;
  
  int odd = 0, even = 0;
  rep(i,n){
    if(card[i]){
      if(card[i] & 1)odd++;
      else even++;
      num += card[i]*(card[i]-1)/2;
    }
  }

  memset(memo,-1,sizeof(memo));
  if(rec(odd, even, num&1))puts("Taro");
  else puts("Hanako");
}