#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);
}

// https://atcoder.jp/contests/abc207/editorial/2153
#include<bits/stdc++.h>
using namespace std;

int main(){
    int N; cin >> N;
    vector<double> a(N),b(N),c(N),d(N);
    for(int _=0; _<2; _++){
        for(int i=0; i<N; i++) cin >> a[i] >> b[i];
        int x = 0, y = 0;
        for(int i=0; i<N; i++){
            x += a[i];
            y += b[i];
            a[i] *= N;
            b[i] *= N;
        }
        for(int i=0; i<N; i++){
            a[i] -= x;
            b[i] -= y;
        }
        swap(a,c);
        swap(b,d);
    }
    for(int i=0; i<N; i++){
        if(a[i]!=0 || b[i]!=0){
            swap(a[i],a[0]);
            swap(b[i],b[0]);
        }
    }
    string ans = "No";
    const double eps = 1e-6;
    for(int i=0; i<N; i++){
        double angle = atan2(d[i],c[i])-atan2(b[0],a[0]);
        bool flag = true;
        for(int j=0; j<N; j++){
            double A = a[j]*cos(angle)-b[j]*sin(angle);
            double B = a[j]*sin(angle)+b[j]*cos(angle);
            bool flag2 = false;
            for(int k=0; k<N; k++){
                if(std::abs(A-c[k])<=eps && std::abs(B-d[k])<=eps) flag2 = true;
            }
            flag &= flag2;
        }
        if(flag) ans = "Yes";
    }
    cout << ans << endl;
}
