#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define rep(i,j,n) for(int i=j;i<n;i++)
#define readvec(v,n) for(int i=0;i<n;i++){cin>>v[i];}
#define MOD 1000000007
int n,m;
vector<vector<int>> v;
vector<vector<int>> dp;
int rec(int i,int j)
{
  if(dp[i][j]!=INT_MIN)return dp[i][j];
  int a=INT_MIN,b=INT_MIN;
  if(i+1<n)a=rec(i+1,j);
  if(j+1<m)b=rec(i,j+1);
  dp[i][j]=v[i][j]-max(a,b);
  return dp[i][j];
}
int main()
{
  cin>>n>>m;
  v = vector<vector<int>>(n,vector<int>(m,0));
  dp = vector<vector<int>>(n,vector<int>(m,INT_MIN));
  rep(i,0,n)rep(j,0,m){char ch;cin>>ch;if(ch=='-')v[i][j]=-1; else v[i][j]=1;}
  dp[n-1][m-1] = v[n-1][m-1];
  int ans = v[0][0]-rec(0,0);
  //cout<<ans;
  if(ans<0)cout<<"Aoki\n"; else if(ans>0)cout<<"Takahashi\n"; else cout<<"Draw\n";
  return 0;
}

#include <algorithm>
#include <bitset>
#include <climits>
#include <cmath>
#include <deque>
#include <iostream>
#include <iomanip>
#include <locale>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>

using namespace std;

int INT_MAX_SQRT = sqrt(INT_MAX);
int pwi(int x, int p) {
    if (p == 0) return 1;
    if (p == 1) return x;
    int tmp = pwi(x, p / 2);
    if (tmp > INT_MAX_SQRT) return 0;  // overflow
    if (p % 2 == 0)
        return tmp * tmp;
    else
        return tmp * tmp * x;
}

long LONG_MAX_SQRT = sqrt(LONG_MAX);
long pwl(long x, long p) {
    if (p == 0) return 1;
    if (p == 1) return x;
    long tmp = pwl(x, p / 2);
    if (tmp > LONG_MAX_SQRT) return 0;  // overflow
    if (p % 2 == 0)
        return tmp * tmp;
    else
        return tmp * tmp * x;
}

map<long, long> factorization(long N) {
    map<long, long> res;
    long SQRT_N = ceil(sqrt(N));
    for (long i = 2; i < SQRT_N; i++) {
        while (N % i == 0) {
            if (res.find(i) == res.end()) {
                res[i] = 1;
            } else {
                res[i] += 1;
            }
            N /= i;
        }
    }
    if (N > SQRT_N) res[N] = 1;
    return res;
}

void debug_vec(string name, vector<int> vec) {
    cout << name << endl;
    for (auto e: vec) cout << e << endl;
}

void debug_vec(string name, vector<long> vec) {
    cout << name << endl;
    for (auto e: vec) cout << e << endl;
}

void debug_mat(string name, vector<vector<long>> mat) {
    cout << name << endl;
    for (auto vec: mat) {
        for (auto e: vec) cout << e << "   ";
        cout << endl;
    }
}

int tonum(string s, vector<char> c, vector<int> v) {
    int ans = 0;
    for (int n = 0; n < c.size(); n++) {
        int i = distance(c.begin(), find(c.begin(), c.end(), s[n]));
        ans = ans * 10 + v[i];
    }
    return ans;
}

void ppp(string s, vector<char> c, vector<int> v) {
    for (int n = 0; n < c.size(); n++) {
        int i = distance(c.begin(), find(c.begin(), c.end(), s[n]));
        cout << v[i];
    }
    cout << endl;
}

int main() {
    int H, W;
    cin >> H >> W;
    vector<vector<int>> grid(H), dp(H);
    for (int h = 0; h < H; h++) {
        grid[h] = vector<int>(W);
        char c;
        for (int w = 0; w < W; w++) {
            cin >> c;
            grid[h][w] = (c == '+' ? 1 : -1) * ((h + w) % 2 == 1 ? 1 : -1);
        }
        dp[h] = vector<int>(W);
    }

    for (int w = W - 2; w >= 0; w--)
        dp[H - 1][w] = dp[H - 1][w + 1] + grid[H - 1][w + 1];

    for (int h = H - 2; h >= 0; h--) {
        dp[h][W - 1] = dp[h + 1][W - 1] + grid[h + 1][W - 1];
        for (int w = W - 2; w >= 0; w--) {
            int r = dp[h + 1][w] + grid[h + 1][w];
            int d = dp[h][w + 1] + grid[h][w + 1];
            if ((h + w) % 2 == 0)
                dp[h][w] = r > d ? r : d;
            else
                dp[h][w] = r > d ? d : r;
        }
    }

    if (dp[0][0] > 0)
        cout << "Takahashi" << endl;
    else if (dp[0][0] < 0)
        cout << "Aoki" << endl;
    else
        cout << "Draw" << endl;
    return 0;
}
