#include <bits/stdc++.h>
        
using namespace std;
    
#define ar array
#define ll long long
    
const int MAX_N = 1e5 + 1;
const ll MOD = 1e9 + 7;
const ll INF = 1e9;

struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};

void output_vector(vector<ll>& v) {
    for(ll i=0;i<v.size()-1;i++) {
        cout<<v[i]<<" ";
    }
    cout<<v.back()<<"\n";
}

ll getSol(vector<vector<ll>>& v, ll i, ll j, ll turn, ll n, ll m, vector<vector<ll>>& dp) {

    if((i == n-1) && (j == m-1)) {
        return 0;
    }

    if(dp[i][j] != -1) {
        return dp[i][j];
    }

    if(turn == 0) {

        ll p1 = INT_MIN;
        if((i + 1) < n) {
            p1 = v[i+1][j] + getSol(v, i+1, j, turn^1, n, m, dp);
        }

        ll p2 = INT_MIN;
        if((j+1) < m) {
            p2 = v[i][j+1] + getSol(v, i, j+1, turn^1, n, m, dp);
        }

        return dp[i][j] = max(p1, p2);

    } else {

        ll p1 = INT_MAX;
        if((i + 1) < n) {
            p1 = -v[i+1][j] + getSol(v, i+1, j, turn^1, n, m, dp);
        }

        ll p2 = INT_MAX;
        if((j+1) < m) {
            p2 = -v[i][j+1] + getSol(v, i, j+1, turn^1, n, m, dp);
        }

        return dp[i][j] = min(p1, p2);

    }

}

void solve() {

    ll n, m;
    cin>>n>>m;

    char pp;
    vector<vector<ll>> v(n, vector<ll>(m, 0));
    for(ll i=0;i<n;i++) {
        for(ll j=0;j<m;j++) {
            cin>>pp;
            if(pp == '+') {
                v[i][j] = 1;
            } else {
                v[i][j] = -1;
            }
        }
    }

    vector<vector<ll>> dp(n, vector<ll>(m, -1));

    ll ppp = getSol(v, 0, 0, 0, n, m, dp);
    if(ppp == 0) {
        cout<<"Draw\n";
    } else if(ppp > 0) {
        cout<<"Takahashi\n";
    } else {
        cout<<"Aoki\n";
    }
    
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    
    int tc = 1;
    // cin >> tc;
    for (int t = 1; t <= tc; t++) {
        // cout << "Case #" << t  << ": ";
        solve();
    }
}
#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;
			}
		}
	}

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

	for(int i = N - 1; i >= 0; --i) {
		for(int j = M - 1; j >= 0; --j) {
			if(i == N - 1 && j == M - 1) {
				dp[i][j] = 0;
			} else if(i == N - 1) {
				dp[i][j] = arr[i][j + 1] - dp[i][j + 1];
			} else if(j == M - 1) {
				dp[i][j] = arr[i + 1][j] - dp[i + 1][j];
			} else {
				dp[i][j] = max(arr[i + 1][j] - dp[i + 1][j], arr[i][j + 1] - dp[i][j + 1]);
			}
		}
	}

	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
	*/
}
