#include <bits/stdc++.h>
#define ll int
const ll maxx=1e9;
using namespace std;
 
ll func(string s[],vector<vector<ll>> &dp,ll x,ll y,ll h,ll w){
    if(dp[x][y]!=maxx)
        return dp[x][y];
    if((x+y)%2==1){
        ll val=maxx;
        if(x<h-1)
            val=min(val,func(s,dp,x+1,y,h,w));
        if(y<w-1)
            val=min(val,func(s,dp,x,y+1,h,w));
        if(x==h-1 and y==w-1)
            val=0;
        if(x!=0 or y!=0){
            if(s[x][y]=='-')
               val-=1;
            else
                val+=1;
        }
        dp[x][y]=val;
    }
    else{
        ll val=-maxx;
        if(x<h-1)
            val=max(val,func(s,dp,x+1,y,h,w));
        if(y<w-1)
            val=max(val,func(s,dp,x,y+1,h,w));
        if(x==h-1 and y==w-1)
            val=0;
        if(x!=0 or y!=0){
            if(s[x][y]=='-')
               val+=1;
            else
                val-=1;
        }
        dp[x][y]=val;
    }
    return dp[x][y];
}
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
	int h,w;
	cin>>h>>w;
	string s[h];
	for(int i=0;i<h;i++)
		cin>>s[i];
    vector<vector<ll>> dp;
    for(ll i=0;i<h;i++){
        vector<ll> v;
        for(ll j=0;j<w;j++)
            v.push_back(maxx);
        dp.push_back(v);
    }
    ll val=func(s,dp,0,0,h,w);
    if(val==0)
        cout<<"Draw";
    else if(val>0)
        cout<<"Takahashi";
    else
        cout<<"Aoki";
	return 0;
}
//我的代码： 
#include<bits/stdc++.h>
#define N 2005
using namespace std;
int n,m,c[N][N],t[N][N],a[N][N],ted[N][N],aed[N][N];
//ted/aed[i][j]分别表示t/a[i][j]是否已经计算完毕 
char ch;
string s;
int A(int x,int y);
int T(int x,int y);
int main(){
	cin>>n>>m,getline(cin,s);//读入
	for(int i=1;i<=n;getline(cin,s),i++) 
		for(int j=1;j<=m;j++)c[i][j]=(ch=getchar()=='+')*2-1;
	ted[n][m]=aed[n][m]=1;//初始化 
	if(T(1,1)<A(1,1))cout<<"Aoki"<<endl;
	else if(T(1,1)>A(1,1))cout<<"Takahashi"<<endl;
	else cout<<"Draw"<<endl;
//	for(int i=1;i<=n;cout<<endl,i++)
//		for(int j=1;j<=m;j++)cout<<T(i,j)-A(i,j)<<" ";//调试语句 
	return 0;
}
int T(int x,int y){//A的最优化 
	if(ted[x][y])return t[x][y];//记忆化 
	ted[x][y]=1;
	if((x+y)&1)return A(x,y),t[x][y];//无操作权，交给对方转移 
	if(x==n)return aed[x][y]=1,a[x][y]=A(x,y+1),t[x][y]=T(x,y+1)+c[x][y+1];//只能向右走 
	if(y==m)return aed[x][y]=1,a[x][y]=A(x+1,y),t[x][y]=T(x+1,y)+c[x+1][y];//只能向下走 
	if(T(x,y+1)+c[x][y+1]-A(x,y+1)>T(x+1,y)+c[x+1][y]-A(x+1,y))//决策下和右哪个更优 
		return aed[x][y]=1,a[x][y]=A(x,y+1),t[x][y]=T(x,y+1)+c[x][y+1];
	else return aed[x][y]=1,a[x][y]=A(x+1,y),t[x][y]=T(x+1,y)+c[x+1][y];
}
int A(int x,int y){//B的最优化 
	if(aed[x][y])return a[x][y];//记忆化 
	aed[x][y]=1;
	if(!((x+y)&1))return T(x,y),a[x][y];//无操作权，交给对方转移 
	if(x==n)return ted[x][y]=1,t[x][y]=T(x,y+1),a[x][y]=A(x,y+1)+c[x][y+1];//只能向右走 
	if(y==m)return ted[x][y]=1,t[x][y]=T(x+1,y),a[x][y]=A(x+1,y)+c[x+1][y];//只能向下走 
	if(A(x,y+1)+c[x][y+1]-T(x,y+1)>A(x+1,y)+c[x+1][y]-T(x+1,y))//决策下和右哪个更优 
		return ted[x][y]=1,a[x][y]=A(x,y+1)+c[x][y+1],t[x][y]=T(x,y+1);
	else return ted[x][y]=1,a[x][y]=A(x+1,y)+c[x+1][y],t[x][y]=T(x+1,y);
}



