#include <bits/stdc++.h>
#define Rep(i,n) for(int i=0;i<n;i++)
#define Repr(i,n) for(int i=n;i>=0;i--)
#define For(i,m,n) for(int i=m;i<n;i++)
#define All(v) v.begin(),v.end()
#define Mod (ll)(1e9+7)
using namespace std;
typedef long long ll;
typedef long double ld;
typedef vector<long long> vl;
const int Inf = INT_MAX / 2; const ll Infl = 1LL << 60;
template<class T>bool chmax(T& a,const T& b){if(a<b){a=b;return 1;}return 0;}
template<class T>bool chmin(T& a,const T& b){if(b<a){a=b;return 1;}return 0;}

int H, W;
string A[2020];
bool vis[2020][2020];
int memo[2020][2020];
int dp(int x, int y) {
    if(vis[y][x]) return memo[y][x];
    vis[y][x] = true;

    int turn = (x + y) % 2;

    if(x==W-1 && y==H-1)return memo[y][x]=0;

    if(turn==0) {
        // Takahashi
        memo[y][x]=-Inf;
        if(y<H-1)chmax(memo[y][x],dp(x,y+1)+(A[y+1][x]=='+'?1:-1));
        if(x<W-1)chmax(memo[y][x],dp(x+1,y)+(A[y][x+1]=='+'?1:-1));
        return memo[y][x];
    }
    else {
        // Aoki
        memo[y][x] = Inf;
        if(y<H-1)chmin(memo[y][x],dp(x,y+1)-(A[y+1][x]=='+'?1:-1));
        if(x<W-1)chmin(memo[y][x],dp(x+1,y)-(A[y][x+1]=='+'?1:-1));
        return memo[y][x];
    }
}

int main()
{
    cin>>H>>W;
    For(y,0,H)cin>>A[y];

    int opt=dp(0,0);

    if(0<opt)cout<<"Takahashi"<<endl;
    else if(opt==0)cout<<"Draw"<<endl;
    else cout<<"Aoki"<<endl;
    return 0;
}
#include<iostream>
#include<sstream>
#include<iomanip>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<map>
#include<cmath>
#include<string>
#include<numeric>
#include<queue>


#define rep(i,p) for(long long int i=0;i<p;i++)
#define reep(i,p) for(long long int i=1;i<=p;i++)
#define ll long long
#define MOD 1000000007
#define INF 9223372036854775800
#define pi 3.14159265359

using namespace std;

int main(){

ll int H,W;
cin >> H >> W;
vector< vector< ll int > > A(H,vector< ll int > (W));
rep(i,H){
	string S;
	cin >> S;
	rep(j,W){
		if( S[j] == '+' ){
			A[i][j] = 1;
		}
		else{
			A[i][j] = -1;
		}
	}
}

if( H==1 && W==1 ){
	cout << "Draw" << endl;
	return 0;
}
vector< vector< ll int > > dp(H,vector< ll int > (W,-INF));



dp[H-1][W-1] = 0;
for( ll int i=1; i<H+W; i++ ){
	for( ll int j=0; j<=i; j++ ){
		if( j > H-1 || i-j > W-1 ){
			continue;
		}
		if( (H-1+W-1+i)%2 == 0 ){

			ll int kari1=-INF; 
			ll int kari2=-INF;
			if( H-1-j+1 < H ){
				kari1 = dp[H-1-j+1][W-1-i+j] + A[H-1-j+1][W-1-i+j];
			}
			if( W-1-i+j+1 < W ){
				kari2 = dp[H-1-j][W-1-i+j+1] + A[H-1-j][W-1-i+j+1] ;
			}
			dp[H-1-j][W-1-i+j] = max( kari1, kari2 );
		}
		else{

			ll int kari1=INF; 
			ll int kari2=INF;
			if( H-1-j+1 < H ){
				kari1 = dp[H-1-j+1][W-1-i+j] - A[H-1-j+1][W-1-i+j];
			}
			if( W-1-i+j+1 < W ){
				kari2 = dp[H-1-j][W-1-i+j+1] - A[H-1-j][W-1-i+j+1] ;
			}
			dp[H-1-j][W-1-i+j] = min( kari1, kari2 );
		}
      
	}
}

//rep(i,H){
//	rep(j,W){
//		if( dp[i][j] == -INF ){
//			cout << '!' << " " ;
//		}
//		else{
//			cout << dp[i][j] << " " ;
//		}
//	}
//	cout << endl;
//}

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


		
		
			











	return 0;

}

