#include <bits/stdc++.h>
using namespace std;
 
using ll = long long int;
using ull = unsigned long long int;
using P = pair<int, int>;
using P3 = pair<int,P>;
using PP = pair<P, P>;
constexpr int INF32 = 1 << 29;
constexpr ll INF64 = 1LL << 61;
constexpr ll MOD = 1000000007;
// constexpr ll MOD = 998244353;
constexpr int di[] = {0, 1, 0, -1};
constexpr int dj[] = {1, 0, -1, 0};
constexpr int di8[] = {0, 1, 1, 1, 0, -1, -1, -1};
constexpr int dj8[] = {1, 1, 0, -1, -1, -1, 0, 1};
constexpr double EPS = 1e-10;
const double PI = acos(-1);
 
#define ALL(v) (v).begin(),(v).end()
#define REP(i,n) for(int i=0,i_len=n; i<i_len; ++i)
 
template<typename T1,typename T2> bool chmax(T1 &a, T2 b) { if (a<b) { a=b; return 1; } return 0; }
template<typename T1,typename T2> bool chmin(T1 &a, T2 b) { if (b<a) { a=b; return 1; } return 0; }

int main(){
    int h, w;
    cin >> h >> w;
    vector<string> s(h);
    for(int i=0;i<h;i++) cin >> s[i];
    vector<vector<int> > dp(h, vector<int>(w));
    for(int i=h-1;i>=0;i--){
        for(int j=w-1;j>=0;j--){
            if(i==h-1 && j==w-1) continue;
            if((i+j)&1){
                int res = -INF32;
                if(i+1<h) chmax(res,dp[i+1][j]+(s[i+1][j]=='+' ? 1 : -1));
                if(j+1<w) chmax(res,dp[i][j+1]+(s[i][j+1]=='+' ? 1 : -1));
                dp[i][j] = res;
            }else{
                int res = INF32;
                if(i+1<h) chmin(res,dp[i+1][j]+(s[i+1][j]=='-' ? 1 : -1));
                if(j+1<w) chmin(res,dp[i][j+1]+(s[i][j+1]=='-' ? 1 : -1));
                dp[i][j] = res;
            }
        }
    }
    string p[] = {"Takahashi", "Aoki"};
    if(dp[0][0] > 0){
        cout << p[1] << endl;
    }else if(dp[0][0] < 0){
        cout << p[0] << endl;
    }else{
        cout << "Draw" << endl;
    }

    return 0;
}
//#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector")
#include <bits/stdc++.h>
#include<vector>
#include<iostream>
#include<set>
#include<string>
#include <array>
using namespace std;
#define ll long long
#define endl '\n'
#define mod 1000000007
#define pb push_back
#define ff first
#define ss second
#define con continue
#define ub upper_bound
#define lb lower_bound

#define si(x) int(x.size())
#define sum_all(a)     ( accumulate ((a).begin(), (a).end(), 0ll))
#define mine(a)    (*min_element((a).begin(), (a).end()))
#define maxe(a)    (*max_element((a).begin(), (a).end()))
#define mini(a)    ( min_element((a).begin(), (a).end()) - (a).begin())
#define maxi(a)    ( max_element((a).begin(), (a).end()) - (a).begin())
#define lowb(a, x) ( lower_bound((a).begin(), (a).end(), (x)) - (a).begin())
#define uppb(a, x) ( upper_bound((a).begin(), (a).end(), (x)) - (a).begin())
const double pi = 2 * acos(0.0);
const int dx[] = { -1, 0, 1, 0 };
const int dy[] = { 0, -1, 0, 1 };

const int dx8[] = { -1, 0, 1, 0,1,1,-1,-1 };
const int dy8[] = { 0, -1, 0, 1,1,-1,1,-1 };

ll min(ll a, ll b)
{
  if (a < b)return a;
  return b;
}
ll max(ll a, ll b)
{
  if (a > b)return a;
  return b;
}
ll ceil1(ll a, ll b)
{
  return(a + b - 1) / b;
}
void read(vector<ll> & arr)
{
  for (ll i = 0; i < si(arr); i++)
    cin >> arr[i];

}

void read_graph(vector<vector<ll>>& g, ll m)
{
  while (m--)
  {
    ll x, y; cin >> x >> y;
    x--, y--;
    g[x].pb(y);
    g[y].pb(x);
  }
}
void solve()
{
  int n, m;
  cin >> n >> m;

  vector<string> arr(n);

  for (int i = 0; i < n; i++) cin >> arr[i];
  vector<vector<pair<int, int>>> dp(n, vector<pair<int, int>>(m));

  for (int i = n - 1; i >= 0; i--)
    for (int j = m - 1; j >= 0; j--)
    {


      vector<pair<ll, pair<ll, ll>>> temp;
      if (i + 1 < n)
      {
        temp.pb({ dp[i + 1][j].ss - dp[i + 1][j].ff,{dp[i + 1][j].ff,dp[i + 1][j].ss} });
        if (arr[i + 1][j] == '+')
        {
          temp[0].ss.ss++;
          temp[0].ff++;
        }
        else
        {
          temp[0].ss.ss--;
          temp[0].ff--;
        }
      }
      if (j + 1 < m)
      {
        temp.pb({ dp[i][j + 1].ss - dp[i][j + 1].ff,{dp[i][j + 1].ff,dp[i][j + 1].ss} });
        if (arr[i][j + 1] == '+')
        {
          temp.back().ss.ss++;
          temp.back().ff++;
        }
        else
        {
          temp.back().ss.ss--;
          temp.back().ff--;
        }
      }

      if (si(temp) == 0) continue;
     
      if(si(temp)!=1)
      if (temp[0].ff < temp[1].ff) swap(temp[0], temp[1]);
      dp[i][j].ff += temp[0].ss.ss;
      dp[i][j].ss += temp[0].ss.ff;
    }
  string res = "Draw";
  if (dp[0][0].ff > dp[0][0].ss) res = "Takahashi";
  else if (dp[0][0].ff < dp[0][0].ss)res = "Aoki";
  cout << res << endl;

}


int main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  #ifndef ONLINE_JUDGE
      freopen("input.txt", "r", stdin);
      freopen("output.txt", "w", stdout);
  #endif
    //int t; cin >> t; while (t--)
  solve();

}
