#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
#define inf 0x7f7f7f7f
#define MAX_SIZE 1000001
#define debug(x) cout<<#x<<" "<<x<<"\n"
#define fast ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define file freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);freopen("error.txt","w",stderr);
#define vi(vec,n) vector<ll>vec(n)
#define vio(vec,n,a) vector<ll>vec(n,a)
#define FOR(i,a,b,c) for(ll i=a;(c)?i<(ll)b:i>=(ll)b;(c)?i+=1:i-=1)
#define eb emplace_back
#define mod (ll)(1e9+7)
#define all(a,b) memset(a,b,sizeof a)
#define whole(v) v.begin(),v.end()
#define rep(i,a,b) for(ll i=(ll)a;i<(ll)b;i++)
#define x first
#define y second

int32_t main(){
    //clock_t tStart = clock();
    // file;
    fast;

    int n,m;
    cin >> n >> m;
    string ar[n];
    for(int i = 0;i < n;i++){
            cin >> ar[i];
    }
    int dp[n][m];
    for(int i = n-1;i >= 0;i--){
        for(int j = m-1;j >= 0;j--){
            dp[i][j] = -((int)1e18);
            if(i==n-1 and j==m-1){
                dp[i][j] = 0;
                continue;
            }
            if(j != m-1){
                dp[i][j] = max(dp[i][j],-dp[i][j+1]+((ar[i][j+1]=='+') ? 1 : -1));
            }
            if(i != n-1){
                dp[i][j] = max(dp[i][j],-dp[i+1][j]+((ar[i+1][j]=='+') ? 1 : -1));
            }
        }
    }
    if(dp[0][0] == 0) cout << "Draw";
    else if(dp[0][0] > 0) cout << "Takahashi";
    else if(dp[0][0] < 0) cout << "Aoki";

    //printf("Time taken: %.6fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
    return 0;
}
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <cstdio>
#include <cmath>
#include <array>
#include <queue>
#include <stack>
#include <map>
#include <set>

using namespace std;

int M[2001][2001];
int H, W;
vector<vector<int>> dp(2001,vector<int>(2001, -1));

int dfs(int i, int j)
{
  if(dp[i][j] != -1) return dp[i][j];

  int ret;
  if ((i + j) % 2 == 0) {
    ret = -1e9;
    if (i + 1 < H) ret = max(ret, dfs(i + 1, j) + M[i + 1][j]);
    if (j + 1 < W) ret = max(ret, dfs(i, j + 1) + M[i][j + 1]);
  } else {
    ret = 1e9;
    if (i + 1 < H) ret = min(ret, dfs(i + 1, j) - M[i + 1][j]);
    if (j + 1 < W) ret = min(ret, dfs(i, j + 1) - M[i][j + 1]);
  }
  return dp[i][j] = ret;
}

int main(){
  cin>> H >> W;
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      char c;
      cin >> c;
      if (c == '+') {
        M[i][j] = 1;
      } else {
        M[i][j] = -1;
      }
    }
  }

  dp[H - 1][W - 1] = 0;

  int ans = dfs(0, 0);
  if (ans == 0) {
    cout << "Draw\n";
  } else if (ans > 0) {
    cout << "Takahashi\n";
  } else {
    cout << "Aoki\n";
  }

  return 0;
}
