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

template<typename T, typename Y> inline void mint(T & x,Y y) {if(y < x) exchange(x,y);}
template<typename T, typename Y> inline void maxt(T & x,Y y) {if(y > x) exchange(x,y);}
template<typename T> istream& operator>>(istream& is, vector<T> &v){for (auto& i : v) is >> i; return is;}
template<typename T> ostream& operator<<(ostream& os, vector<T> & v){for (auto& i : v) os << i << " "; return os;}

#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define si(x) (int)x.size()
#define logit cerr << "im here" << endl;
int xcor [] {-1,0,0,1};
int ycor [] {0,-1,1,0};
 
typedef int64_t ll;
typedef pair<ll,ll> pll;
typedef pair<int,int> pii;
 
constexpr int mod = (int) 1'000'000'007;
constexpr int maxn = (int) 2001;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int n,m;
pii dp[maxn][maxn][2];


pii rec(vector<vector<char>>& A,int i,int j,bool turn){ // turn {0,1} : {tak,aoki}

	assert(i < n && j < m);
	
	if( dp[i][j][turn] != make_pair(INT_MIN,INT_MIN) ) return dp[i][j][turn];

	pii ret = {0,0};

	if(i || j){ // first block doesnt count

		if(turn){ // tak
			A[i][j] == '+' ? ret.first++ : ret.first--;
		}else{ // aok
			A[i][j] == '+' ? ret.second++ : ret.second--;
		}
	}

	if(!turn){
		if(i < n-1 && j < m-1){ // can go both

			pii _a = rec(A,i+1,j,!turn);
			pii _b = rec(A,i,j+1,!turn);

			if(_a.first-_a.second > _b.first-_b.second){
				ret.first += _a.first,ret.second += _a.second;
			}else{
				ret.first += _b.first,ret.second += _b.second;
			}
		}else if(i < n-1){
			pii _a = rec(A,i+1,j,!turn);
			ret.first += _a.first,ret.second += _a.second;
		}else if(j < m-1){
			pii _a = rec(A,i,j+1,!turn);
			ret.first += _a.first,ret.second += _a.second;
		}
	}else{
		if(i < n-1 && j < m-1){ // can go both
			pii _a = rec(A,i+1,j,!turn);
			pii _b = rec(A,i,j+1,!turn);

			if(_a.first-_a.second < _b.first-_b.second){
				ret.first += _a.first,ret.second += _a.second;
			}else{
				ret.first += _b.first,ret.second += _b.second;
			}
		}else if(i < n-1){
			pii _a = rec(A,i+1,j,!turn);
			ret.first += _a.first,ret.second += _a.second;
		}else if(j < m-1){
			pii _a = rec(A,i,j+1,!turn);
			ret.first += _a.first,ret.second += _a.second;
		}

	}
	return dp[i][j][turn] = ret;
}


auto solve() -> decltype(auto){
	cin >> n >> m;
	vector<vector<char>> A(n,vector<char>(m));
	for(auto & vec : A){
		cin >> vec;
	}
	for(int i = 0;i < maxn;i++){
		for(int j = 0;j < maxn;j++){
			for(int k = 0;k < 2;k++){
				dp[i][j][k] = {INT_MIN,INT_MIN};
			}
		}
	}
	rec(A,0,0,0);

	pii ans = dp[0][0][0];

	if(ans.first > ans.second){
		cout << "Takahashi\n";
	}else if(ans.first < ans.second){
		cout << "Aoki\n";
	}else{
		cout <<  "Draw\n";
	}
}

int32_t main(void){
	ios::sync_with_stdio(false);cin.tie(0);
	#ifdef aly_local
	freopen("in.txt","r",stdin);
	#endif
	uint32_t tcs = 1;
	// cin >> tcs;
	for(uint32_t i = 1;i <= tcs;i++) solve();
}
#include <bits/stdc++.h>

// #include <atcoder/all>
#define rep(i, s, t) for (int i = s; i < t; ++i)
using namespace std;
// using namespace atcoder;

using ll = unsigned long long;
using P = pair<int, int>;
constexpr int INF = (int)2e9;
constexpr ll INFll = (ll)1e18;
constexpr int MOD = 1e9 + 7;

int main() {
  int H, W;
  cin >> H >> W;
  vector<string> A(H);
  rep(i, 0, H) cin >> A[i];

  vector<vector<P>> dp(H, vector<P>(W));
  for (int i = H - 2; i >= 0; --i) {
    auto r = dp[i + 1][W - 1];
    auto rT = r.first, rA = r.second;
    auto rnext = (A[i + 1][W - 1] == '+' ? 1 : -1);
    if ((i + W - 1) % 2 == 0)
      dp[i][W - 1] = P {rT + rnext, rA};
    else
      dp[i][W - 1] = P {rT, rA + rnext};
  }

  for (int j = W - 2; j >= 0; --j) {
    auto d = dp[H - 1][j + 1];
    auto dT = d.first, dA = d.second;
    auto dnext = (A[H - 1][j + 1] == '+' ? 1 : -1);
    if ((H - 1 + j) % 2 == 0)
      dp[H - 1][j] = P {dT + dnext, dA};
    else
      dp[H - 1][j] = P {dT, dA + dnext};
  }

  for (int i = H - 2; i >= 0; --i)
    for (int j = W - 2; j >= 0; --j) {
      auto r = dp[i + 1][j], d = dp[i][j + 1];
      auto rT = r.first, rA = r.second, dT = d.first, dA = d.second;
      auto rnext = (A[i + 1][j] == '+' ? 1 : -1),
           dnext = (A[i][j + 1] == '+' ? 1 : -1);
      if ((i + j) % 2 == 0) {
        if (rT + rnext - rA > dT + dnext - dA)
          dp[i][j] = P {rT + rnext, rA};
        else
          dp[i][j] = P {dT + dnext, dA};
      } else {
        if (rA + rnext - rT > dA + dnext - dT)
          dp[i][j] = P {rT, rA + rnext};
        else
          dp[i][j] = P {dT, dA + dnext};
      }
    }

  auto t = dp[0][0].first, a = dp[0][0].second;
  if (t > a)
    cout << "Takahashi" << endl;
  else if (t < a)
    cout << "Aoki" << endl;
  else
    cout << "Draw" << endl;
}