#include <bits/stdc++.h>

#define ll long long
#define map unordered_map
#define set unordered_set
#define l_l pair<ll, ll>
#define P pair<ll, ll>
#define vll vector<ll>
#define mll map<ll, ll>
#define mp make_pair
#define rep(i, n) for (int i = 0, i##_len = (n); i < i##_len; ++i)
#define reps(i, n) for (int i = 1, i##_len = (n); i <= i##_len; ++i)
#define rev(i, n) for (int i = ((int)(n)-1); i >= 0; --i)
#define revs(i, n) for (int i = ((int)(n)); i > 0; --i)
// template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
// template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }

using namespace std;

const ll MOD = 1000000007LL;
const ll INF = (1LL << 60LL);
ll H, W;

// template <class T> void plus_mod(T &a, const T &b) {a = (a + b) % MOD;}

ll grid[2005][2005];

ll dp[2005][2005];

ll TE;

ll calc(ll y, ll x) {
  if (dp[y][x] != INF) return dp[y][x];

  ll te = y + x;
  bool is_taka = (te % 2 == 0);

  ll plus = is_taka ? grid[y][x] : -grid[y][x];

  if (y == H - 1 && x == W - 1) {
    dp[y][x] = -plus;
    return -plus;
  }

  ll v;
  if (x < W - 1 && y < H - 1) {
    //
    ll v1 = calc(y, x + 1);
    ll v2 = calc(y + 1, x);

    if (is_taka) {
      v = max(v1, v2);
    } else {
      v = min(v1, v2);
    }

  } else if (x < W - 1) {
    v = calc(y, x + 1);
  } else if (y < H - 1) {
    v = calc(y + 1, x);
  }
  v -= plus;

  dp[y][x] = v;

  return v;
}

template <typename A, size_t N, typename T>
void Fill(A (&array)[N], const T &val) {
  std::fill((T *)array, (T *)(array + N), val);
}

void show_table(ll I, ll J) {
  rep(i, I) {
    rep(j, J) { cout << dp[i][j] << " "; }
    cout << "" << endl;
  }
  cout << "" << endl;
}
int main() {
  // std::cout << std::fixed << std::setprecision(10);

  Fill(dp, INF);

  // + 青
  // - 赤
  scanf("%lld %lld", &H, &W);

  rep(y, H) {
    string line;
    cin >> line;

    rep(x, W) {
      char ch = line[x];
      if (ch == '-') grid[y][x] = -1;
      if (ch == '+') grid[y][x] = 1;
    }
  }

  // cout << (calc(1, 0)) << endl;

  if (H == 1 && W == 1) {
    cout << ("Draw") << endl;
    return 0;
  }

  ll TE = H + W - 2;

  ll c = calc(0, 0);

  ll v;

  if (W >= 2 && H >= 2) {
    ll v1 = dp[0][1];
    ll v2 = dp[1][0];
    v = max(v1, v2);
  } else if (W >= 2) {
    v = dp[0][1];
  } else {
    v = dp[1][0];
  }

  // cout << "v:" << (v) << endl;

  if (v == 0) {
    cout << ("Draw") << endl;
  } else if (v >= 1) {
    cout << ("Takahashi") << endl;
  } else {
    cout << ("Aoki") << endl;
  }

  // show_table(H, W);
}

#include <bits/stdc++.h>
using namespace std;
using ll = long long; 
using ull = unsigned long long;
using vi = vector<int>; 
using vll = vector<long long>; 
using vb = vector<bool>;
using vd = vector<double>;
using vc = vector<char>;
using vvi = vector<vector<int>>; 
using vvll = vector<vector<long long>>;
using vvc = vector<vector<char>>;
using pii = pair<int,int>; 
using pll = pair<ll,ll>;
template<typename T> using min_priority_queue = priority_queue<T, vector<T>, greater<T>>;
template<typename T> using graph = vector<vector<pair<T, int>>>;// pair of weight and vertex
template<typename T> inline bool chmax(T& a, const T b){ if(a < b){ a = b; return true; } return false; }
template<typename T> inline bool chmin(T& a, const T b){ if(a > b){ a = b; return true; } return false; }
void my_answer(){
    // 本質的にはミニマックス法と同じだが、dpの定義が通常とは違ってしまっているっぽい
    // dp[i][j] := if (i+j) % 2 == 0: Score(Takahashi) - Score(Aoki)の最大値
    //             elif: Score(Aoki) - Score(Takahashi)の最大値
   int h, w;
   cin >> h >> w;

   vvc fi(h, vc(w));
   for(auto& y: fi) for(auto& x: y) cin >> x;

   vvi dp(h, vi(w, INT32_MIN));
   dp[h-1][w-1] = 0;
   for(int y = h-1; y >= 0; --y){
       for(int x = w-1; x >= 0; --x){
           if(y+1 <= h-1) chmax(dp[y][x], -dp[y+1][x] + (fi[y+1][x] == '+' ? 1 : -1));
           if(x+1 <= w-1) chmax(dp[y][x], -dp[y][x+1] + (fi[y][x+1] == '+' ? 1 : -1));
           }
       }

   if(dp[0][0] == 0){
       cout << "Draw" << endl;
   }else if(dp[0][0] > 0){
       cout << "Takahashi" << endl;
   }else{
       cout << "Aoki" << endl;
   }
}
void best_answer(){
    // ミニマックス法（模範解答）
    // dp[i][j] := Score(Takahashi) - Score(Aoki)
    // if (i+j) % 2 == 0: Takahashiスタート。dp[i][j]を最大化しようとする。入る得点はTakahashiのものとして考えるので、+で計算。
    // elif: Aokiスタート。dp[i][j]を最小化しようとする。入る得点はAokiのものとして考えるので、-で計算。
   
   int h, w;
   cin >> h >> w;

   vvc fi(h, vc(w));
   for(auto& y: fi) for(auto& x: y) cin >> x;

   vvi dp(h, vi(w, 0));
   for(int y = h-1; y >= 0; --y){
       for(int x = w-1; x >= 0; --x){
           if((y + x) % 2 == 0){
               // Takahashi start
               if(y+1 <= h-1 || x+1 <= w-1) dp[y][x] = INT32_MIN;
               if(y+1 <= h-1) chmax(dp[y][x], dp[y+1][x] + (fi[y+1][x] == '+' ? 1 : -1));
               if(x+1 <= w-1) chmax(dp[y][x], dp[y][x+1] + (fi[y][x+1] == '+' ? 1 : -1));
           }else{
               // Aoki start
               if(y+1 <= h-1 || x+1 <= w-1) dp[y][x] = INT32_MAX;
               if(y+1 <= h-1) chmin(dp[y][x], dp[y+1][x] - (fi[y+1][x] == '+' ? 1 : -1));
               if(x+1 <= w-1) chmin(dp[y][x], dp[y][x+1] - (fi[y][x+1] == '+' ? 1 : -1));
           }
       }
   }

   if(dp[0][0] == 0){
       cout << "Draw" << endl;
   }else if(dp[0][0] > 0){
       cout << "Takahashi" << endl;
   }else{
       cout << "Aoki" << endl;
   }
}
int main(){

    // my_answer();
    best_answer();
}
