#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization("unroll-loops")

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

// size(x), rbegin(x), rend(x) need C++17
#define sz(x) int((x).size())
#define all(x) begin(x), end(x)
#define rall(x) x.rbegin(), x.rend() 
#define sor(x) sort(all(x)) 
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define fi first
#define se second


#define mset(a,b) memset(a, b, sizeof(a))
#define dbg(x) cout << "[" << #x << "]: " << x << endl;
#define forn(i,n) for(int i=0; i < n;i++)
#define nrof(i,n) for(int i = n-1; i >= 0; i--)
#define fori(i,a,b) for(int i = a; i <= b; i++)
#define irof(i,b,a) for(int i = b; i >= a; i--)
#define each(val, v) for(auto &val : v)

using ll = long long;
using db = long double; //pode ser double

using pi = pair<int,int>;
using pl = pair<ll,ll>;
using pd = pair<db,db>;

using vi = vector<int>;
using vb = vector<bool>;
using vl = vector<ll>;
using vd = vector<db>; 
using vs = vector<string>;
using vpi = vector<pi>;
using vpl = vector<pl>; 
using vpd = vector<pd>;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); 
mt19937_64 rng64(chrono::steady_clock::now().time_since_epoch().count());

const int MAXN = 2e5 + 5;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9+7;
const db EPS = 1e-9;
const db PI = acos((db)-1);


int M[3000][3000];
int dp[3000][3000];
void solve(){
	int n,m;
	cin >> n >> m;
	
	forn(i,3000){
		forn(j,3000){
			dp[i][j] = INF;
			M[i][j] = 0;
		}
	}
	forn(i,n){
		string s;
		cin >> s;

		forn(j,m){
			M[i][j] = (s[j] == '+'?1:-1);
		}
	}
	
	nrof(i,n){
		nrof(j,m){
			dp[i][j] = -INF;
			
			if(i == n-1 && j == m-1){
				dp[i][j] = 0;
				continue;
			}

			if(i != n-1){
				dp[i][j] = max(dp[i][j], M[i+1][j] - dp[i+1][j]);
			}

			if(j != m-1){
				dp[i][j] = max(dp[i][j], M[i][j+1] - dp[i][j+1]);
			}
		}
	}

	if(dp[0][0] == 0){
	
		cout << "Draw\n";
	}else{
		cout << (dp[0][0] > 0 ? "Takahashi":"Aoki") << '\n';
	}

}

int main(){

    ios::sync_with_stdio(false); cin.tie(NULL);

    int t = 1;
    //cin >> t;
    while(t--){
        solve();
    }

    return 0;
}

/*
PRESTA ATENCAO!!!!

NAO FIQUE PRESO EM UMA ABORDAGEM
A SUA INTUICAO PODE ESTAR ERRADA - TENTE OUTRAS COISAS
LIMPOU TUDO PARA O PROXIMO CASO?
caso especial? n == 1 

*/

#include <bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(), (x).end()
typedef long long ll;

void solve(int tc)
{
    int h, w; cin >> h >> w;
    vector<string> board(h);
    for (int i = 0; i < h; i++)
        cin >> board[i];

    auto inc = [&](int i, int j) {
        return (board[i][j] == '+') == ((i + j) % 2 == 1);
    };

    vector<vector<int>> dp(h, vector<int>(w));
    for (int i = 0; i < h; i++)
    {
        for (int j = 0; j < w; j++)
        {
            if (i == 0 && j == 0)
                continue;
            if (inc(i, j))
                dp[i][j]++;
            else
                dp[i][j]--;
        }
    }
    for (int i = h-1; i >= 0; i--)
    {
        for (int j = w-1; j >= 0; j--)
        {
            bool taka = (i + j) % 2 == 0;
            if (i == h-1 && j == w-1)
                continue;
            else if (i == h-1)
                dp[i][j] += dp[i][j+1];
            else if (j == w-1)
                dp[i][j] += dp[i+1][j];
            else if (taka)
                dp[i][j] += max(dp[i][j+1], dp[i+1][j]);
            else
                dp[i][j] += min(dp[i][j+1], dp[i+1][j]);
        }
    }
    
    int score = dp[0][0];
    if (score > 0)
        cout << "Takahashi\n";
    else if (score < 0)
        cout << "Aoki\n";
    else
        cout << "Draw\n";
}

int main()
{
	ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
	int T = 1;
	for (int t = 1; t <= T; t++)
        solve(t);
}

