#include <bits/stdc++.h>
using namespace std;

#ifdef LOCAL
#include <debugger.h>
#else
#define dbg(x...) {}
#define dbg_t()   {}
#endif

using ll = long long;
using ld = long double;

const ll INF = 1e18;


void solve()
{
  ll n, m; cin >> n >> m;

  vector<string> grid(n);
  for (ll i = 0; i < n; i++)
    cin >> grid[i];

  dbg(grid);

  auto in = [&](ll x, ll y)
  {
    return (x >= 0 && y >= 0 && x < n && y < m);
  };

  vector<vector<array<ll, 2>>> dp(n, vector<array<ll, 2>>(m, {INF, INF}));

  function<array<ll, 2>(ll, ll)> rec = [&](ll a, ll b)
  {
    dbg(a, b);

    array<ll, 2> r = {0ll, 0ll};

    if ((a == n - 1) && (b == m - 1))
      return r;

    if (!in(a, b))
      return r;

    array<ll, 2> d = {INF, INF};

    if (dp[a][b] != d)
      return dp[a][b];

    array<ll, 2> x1 = rec(a, b + 1), x2 = rec(a + 1, b);

    array<ll, 2> ans1 = {0, INF}, ans2 = {0, INF}, ans;

    if (in(a, b + 1))
    {
      if (grid[a][b + 1] == '+')
        ans1 = {x1[1] + 1, x1[0]};
      else
        ans1 = {x1[1] - 1, x1[0]};
    }

    if (in(a + 1, b))
    {
      if (grid[a + 1][b] == '+')
        ans2 = {x2[1] + 1, x2[0]};
      else
        ans2 = {x2[1] - 1, x2[0]};
    }

    if ((ans1[0] - ans1[1]) > (ans2[0] - ans2[1]))
      ans = ans1;
    else
      ans = ans2;

    return dp[a][b] = ans;
  };

  array<ll, 2> res = rec(0, 0);

  dbg(res);

  if (res[0] > res[1])
    cout << "Takahashi" << "\n";
  else if (res[1] > res[0])
    cout << "Aoki" << "\n";
  else
    cout << "Draw" << "\n";
}


signed main()
{  
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);

#ifdef LOCAL
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
#endif

  ll _t = 1;
  // cin >> _t;
  for (ll i = 1; i <= _t; i++)
  {
    // cout << "Case #" << i << ": ";
    solve();
  }

  dbg_t();
  
  return 0;
}     
     

#include "bits/stdc++.h"
using namespace std;

#define mp make_pair
#define pb push_back
#define ll long long int
#define sdll(x) scanf("%lld",&x)
#define sd(x) scanf("%d",&x)
#define inf (ll)(1e18+9)
#define pll pair<ll,ll>
#define pii pair<int,int>
#define bits(x) __builtin_popcount(x)
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define bitsll(x) __builtin_popcountll(x)
#define all(x) x.begin(),x.end()
#define ld long double
#define test() ll test; cin>>test; while(test--)
#define fi first
#define se second

inline ll GCD(ll x, ll y) {
    if(x<y) swap(x,y);
    if(x==0) return y;
    if(y==0) return x;
    return GCD(x%y,y);
}

ll phi(ll n) {
    ll result = n;
    for (ll i = 2; i * i <= n; i++) {
        if(n % i == 0) {
            while(n % i == 0)
                n /= i;
            result -= result / i;
        }
    }
    if(n > 1)
        result -= result / n;
    return result;
}

ll power(ll x, ll n, ll mod) {
    ll res = 1;
    x %= mod;
    while(n) {
        if(n&1) {
            res = ((res*x)%mod+mod)%mod;
        }
        x = ((x*x)%mod+mod);
        n>>=1;
    }

    return res;
}

const int MAXN = 2005;
const ll INIT_VALUE = -inf;

int H,W;
ll dp[MAXN][MAXN];
char mat[MAXN][MAXN];

void clear() {
    for(int i=0;i<=H;i++) {
        for(int j=0;j<=W;j++) {
            dp[i][j] = INIT_VALUE;
        }
    }
}

inline bool check(int x ,int y) {
    return x>=1 && x<=H && y>=1 && y<=W;
}

inline ll getvalue(int x, int y) {
    return mat[x][y]=='+'?1:-1;
}

ll solve(int x, int y);

ll solving(int x, int y) {
    ll ans = -inf;
    if(mat[x][y]=='+') {
        if(check(x+1,y) && check(x,y+1)) {
            ans = max(ans,1+min(solve(x+1,y)-getvalue(x+1,y),solve(x,y+1)-getvalue(x,y+1)));
        } else if(check(x+1,y)) {
            ans = max(ans,1+solve(x+1,y)-getvalue(x+1,y));
        } else if(check(x,y+1)) {
            ans = max(ans,1+solve(x,y+1)-getvalue(x,y+1));
        } else {
            ans = 1;
        }
    } else {
        if(check(x+1,y) && check(x,y+1)) {
            ans = max(ans,-1+min(solve(x+1,y)-getvalue(x+1,y),solve(x,y+1)-getvalue(x,y+1)));
        } else if(check(x+1,y)) {
            ans = max(ans,-1+solve(x+1,y)-getvalue(x+1,y));
        } else if(check(x,y+1)) {
            ans = max(ans,-1+solve(x,y+1)-getvalue(x,y+1));
        } else {
            ans = -1;
        }
    }
    return ans;
}

ll solve(int x, int y) {
    if(!check(x,y)) {
        return -inf;
    }

    if(x==H && y==W) return 0;

    if(dp[x][y]!=INIT_VALUE) return dp[x][y];

    ll ans = -inf;

    if(check(x+1,y)) {
        ans = max(ans,solving(x+1,y));
    } 

    if(check(x,y+1)) {
        ans = max(ans,solving(x,y+1));
    }

    // cout<<x<<" "<<y<<" "<<ans<<endl;

    return dp[x][y] = ans;
}


int main() {
    fastio;

    cin>>H>>W;

    for(int i=1;i<=H;i++) {
        for(int j=1;j<=W;j++) {
            cin>>mat[i][j];
        }
    }
   
    clear();

    ll ans = solve(1,1);
    if(ans>0) {
        cout<<"Takahashi"<<endl;
    } else if(ans<0) {
        cout<<"Aoki"<<endl;
    } else {
        cout<<"Draw"<<endl;
    }

}




