#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define ld long double
#define ff first
#define ss second
#define rsz resize
#define ins insert 
#define mp make_pair
#define pf push_front 
#define pb push_back
#define eb emplace_back 
#define ft front() 
#define bk back()
#define sz(x) (int)(x).size()
#define all(x) begin(x), end(x)
#define rep(i,a,b) for (int i = (a); i < (b); ++i)

#ifndef ONLINE_JUDGE
#define deb(x) cerr<< #x <<" "; __print(x); cerr<<endl;
#else
#define deb(x)
#endif

const ll mod = 1e9+7; // 998244353;
const ll inf = 1e18; 
const ld pie = acos((ld)-1);

ll mod_add(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a + b) % m) + m) % m;}
ll mod_mul(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a * b) % m) + m) % m;}
ll mod_sub(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a - b) % m) + m) % m;}

int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};

void __print(int x) {cerr<<x;}
void __print(char x) {cerr<<x;}
void __print(string x) {cerr<<x;}
void __print(float x) {cerr<<x;}
void __print(double x) {cerr<<x;}
void __print(bool x) {cerr<<x;}
void __print(ll x) {cerr<<x;}

template<class T, class U> void __print(pair<T,U> p) {cerr<<"{"<<p.ff<<", "<<p.ss<<"}";}
template<class T> void __print(vector<T> arr) { cerr<<"[ "; for(auto x:arr) { __print(x);cerr<<" "; } cerr<<"]"; }
template<class T> void __print(set<T> st) { cerr<<"{ "; for(auto x:st) { __print(x); cerr<<" "; } cerr<<"}";}
template<class T, class U> void __print(vector<pair<T,U>> arr) { cerr<<"[ "; for(auto x:arr) {__print(x);cerr<<", ";}cerr<<"]";}
template<class T, class U> void __print(unordered_map<T,U> arr) { cerr<<"{ "; for(auto x:arr) {__print(x);cerr<<", ";}cerr<<"}";}
template<class T, class U> void __print(map<T,U> arr) { cerr<<"{ "; for(auto x:arr) {__print(x);cerr<<", ";}cerr<<"}";}
template<typename... T> void read(T&... args) { ((cin>>args),...);}
template<typename... T> void write(T&&... args){((cout<<args<<" "),...);cout<<'\n';}

int N,M;

int main(){
    
	scanf("%d%d", &N, &M);

	vector<vector<int>> arr(N, vector<int>(M, 0));

	rep(i, 0, N) {
		string s;
		cin>>s;
	
		for(int j = 0; j < M; ++j) {
			if(s[j] == '+') {
				arr[i][j] = 1;
			} else {
				arr[i][j] = -1;
			}
		}
	}

	//X -> score of 1st player
	//y -> score of 2nd player
	//first player tries to maximise the X - Y -> max
	//second player tries to minimise the X - Y -> min

	vector<vector<int>> dp(N, vector<int>(M, 0));

	//decreasing order of evaluation
	for(int i = N - 1; i >= 0; --i) {
		for(int j = M - 1; j >= 0; --j) {
			if(i == N - 1 && j == M - 1) {
				continue;
			}

			if((i + j)%2 == 0) { // first player
				dp[i][j] = INT_MIN;
				if(i + 1 < N) {
					dp[i][j] = max(dp[i][j], arr[i + 1][j] + dp[i + 1][j]);
				} 
				if(j + 1 < M) {
					dp[i][j] = max(dp[i][j], arr[i][j + 1] + dp[i][j + 1]);
				}

			} else { //second player
				dp[i][j] = INT_MAX;
				if(i + 1 < N) {
					dp[i][j] = min(dp[i][j], dp[i + 1][j] - arr[i + 1][j]);
				}
				if(j + 1 < M) {
					dp[i][j] = min(dp[i][j], dp[i][j + 1] - arr[i][j + 1]);
				}
			}
		}
	}

	// for(int i = 0; i < N; ++i) {
	// 	for(int j = 0; j < M; ++j) {
	// 		printf("%d ",dp[i][j]);
	// 	}printf("\n");
	// }

	if(dp[0][0] > 0) {
		puts("Takahashi");
	} else if(dp[0][0] < 0) {
		puts("Aoki");
	} else {
		puts("Draw");
	}

	return 0;

	/*STUFF TO LOOK:	
		1. Check the constraints
		2. Corner cases(n==0||n==1)
		3. Variables in loops
		4. Make sure two ints aren’t multiplied to get a long long
		5. Don't use scanf or printf while using ios_base
		6. using the local variable of the same name when global variable was required to be used
	*/
}

#include<bits/stdc++.h>
using namespace std;
const int N=2005;
char a[N][N];
int dp[N][N];
int n,m;
map<char,int>mp;
int main(){
        mp['+']=1;mp['-']=-1;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++)cin>>a[i][j];
        dp[n][m]=0;
        for(int i=n;i>=1;i--)
                for(int j=m;j>=1;j--){
                        if(i==n&&j==m)continue;
                        int flag=((i+j)%2==0);
                        if(flag){
                                dp[i][j]=-N*N;
                                if(i+1<=n)dp[i][j]=max(dp[i][j],dp[i+1][j]+mp[a[i+1][j]]);
                                if(j+1<=m)dp[i][j]=max(dp[i][j],dp[i][j+1]+mp[a[i][j+1]]);
                        }else{
                                dp[i][j]=N*N;
                                if(i+1<=n)dp[i][j]=min(dp[i][j],dp[i+1][j]-mp[a[i+1][j]]);
                                if(j+1<=m)dp[i][j]=min(dp[i][j],dp[i][j+1]-mp[a[i][j+1]]);
                        }
                }
        if(dp[1][1]>0)puts("Takahashi");
        else if(dp[1][1]<0)puts("Aoki");
        else puts("Draw");
        return 0;
}