// Problem: D - Game in Momotetsu World
// Contest: AtCoder - Mynavi Programming Contest 2021（AtCoder Beginner Contest 201）
// URL: https://atcoder.jp/contests/abc201/tasks/abc201_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
using namespace std;
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);
#define int long long
#define ld long double
#define pii int
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define rep(i,x,y) for(int i=x; i<y; i++)
#define fill(a,b) memset(a,b,sizeof(a))
#define vi vector<int>
#define vii vector<pair<int,int>>
#define setbits(x) __builtin_popcountll(x)
#define w(x)  int x; cin>>x; while(x--)
#define in(a) for(auto &x: a)cin>>x;
#define out(a) for(auto x: a){cout<<x<<' ';}cout<<'\n';
#define inf 1000000000
//#define mm 1000000007 998244353
void print(bool n){if(n)cout<<"YES";else cout<<"NO";cout<<'\n';}
int n,m;
vector<vector<short>> a;
vector<vector<int>> dp;
vector<vector<bool>> vis;
int fun(int i,int j){
	if(vis[i][j])return dp[i][j];
	int di[]={1,0};
	int dj[]={0,1};
	int ans=-inf;
	for(int k=0;k<2;k++){
		int I=i+di[k],J=j+dj[k];
		if(I>=n || J>=m)continue;
		ans=max(ans,a[I][J]-fun(I,J));
	}
	vis[i][j]=1;
	if(ans==-inf)ans=0;
	return dp[i][j]=ans;
}
signed main(){
	cin>>n>>m;
	a.resize(n,vector<short>(m,-1));
	dp.resize(n,vector<int>(m));
	vis.resize(n,vector<bool>(m,false));
	char c;
	rep(i,0,n){
		rep(j,0,m){
			cin>>c;
			if(c=='+')a[i][j]=1;
		}
	}
	int ans=fun(0,0);
	/*for(auto z: dp){
		for(auto x: z)cout<<x<<' ';
		cout<<'\n';
	}*/
	if(ans==0)cout<<"Draw\n";
	if(ans>0)cout<<"Takahashi\n";
	if(ans<0)cout<<"Aoki\n";
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
using std::cout;
using std::cin;
using std::endl;
using ll=long long;
using ld=long double;
ll I=1167167167167167167;
ll Q=1e9+7;
#define rep(i,a) for (ll i=0;i<a;i++)
template<class T> using _pq = priority_queue<T, vector<T>, greater<T>>;
template<class T> ll LB(vector<T> &v,T a){return lower_bound(v.begin(),v.end(),a)-v.begin();}
template<class T> ll UB(vector<T> &v,T a){return upper_bound(v.begin(),v.end(),a)-v.begin();}
template<class T> bool chmin(T &a,const T &b){if(a>b){a=b;return 1;}else return 0;}
template<class T> bool chmax(T &a,const T &b){if(a<b){a=b;return 1;}else return 0;}
template<class T> void So(vector<T> &v) {sort(v.begin(),v.end());}
template<class T> void Sore(vector<T> &v) {sort(v.begin(),v.end(),[](T x,T y){return x>y;});}
template<class T> void print_tate(vector<T> &v) {rep(i,v.size()) cout<<v[i]<<"\n";}
void yneos(bool a){if(a) cout<<"Yes"<<"\n"; else cout<<"No"<<"\n";}

int f(char a){
	if(a=='+') return 1;
	return -1;
}

//GCJ頑張る
int main() {
	int H,W;
	cin>>H>>W;
	vector<vector<int>> dp(H,vector<int>(W));
	vector<string> S(H);
	rep(i,H) cin>>S[i];
	for(int i=H-1;i>=0;i--) for(int j=W-1;j>=0;j--){
		int a=(i+j)%2;
		a*=-2;
		a+=1;
		if(i+j==H+W-2) continue;
		int b,c;
		if(j!=W-1){
			b=f(S[i][j+1])*a;
			dp[i][j]=b+dp[i][j+1];
		}
		if(i!=H-1){
			c=f(S[i+1][j])*a;
			dp[i][j]=c+dp[i+1][j];
		}
		if(i!=H-1&&j!=W-1){
			/*cout<<a<<" "<<i<<" "<<j<<" "<<b<<" "<<c<<endl;
			cout<<S[i][j+1]<<" "<<S[i+1][j]<<endl;*/
			if(a==1){
				dp[i][j]=max(b+dp[i][j+1],c+dp[i+1][j]);
			}
			else dp[i][j]=min(b+dp[i][j+1],c+dp[i+1][j]);
		}
	}
	if(dp[0][0]>0) cout<<"Takahashi";
	else if(dp[0][0]<0) cout<<"Aoki";
	else cout<<"Draw";
	cout<<"\n";
	/*rep(i,H){
		rep(j,W) cout<<dp[i][j]<<" ";
		cout<<"\n";
	}*/
}
