//12252024832524
#include <cstdio>
#include <cstring>
#include <algorithm>
#define TT template<typename T>
using namespace std; 

typedef long long LL;
const int MAXN = 2005;
const int INF = 0x3f3f3f3f;
int n,m;
char a[MAXN][MAXN];

LL Read()
{
	LL x = 0,f = 1;char c = getchar();
	while(c > '9' || c < '0'){if(c == '-')f = -1;c = getchar();}
	while(c >= '0' && c <= '9'){x = (x*10) + (c^48);c = getchar();}
	return x * f;
}
TT void Put1(T x)
{
	if(x > 9) Put1(x/10);
	putchar(x%10^48);
}
TT void Put(T x,char c = -1)
{
	if(x < 0) putchar('-'),x = -x;
	Put1(x); if(c >= 0) putchar(c);
}
TT T Max(T x,T y){return x > y ? x : y;}
TT T Min(T x,T y){return x < y ? x : y;}
TT T Abs(T x){return x < 0 ? -x : x;}

int dp[MAXN][MAXN][2];
int p(int x,int y)
{
	if(a[x][y] == '+') return 1;
	return 0;
}
int dfs(int x,int y,int who)
{
	if(x == n && y == m) return 0;
	if(dp[x][y][who] != INF) return dp[x][y][who];
	int ret = -INF;
	if(x < n) ret = Max(ret,p(x+1,y)-dfs(x+1,y,who^1));
	if(y < m) ret = Max(ret,p(x,y+1)-dfs(x,y+1,who^1));
	return dp[x][y][who] = ret;
}

int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	n = Read(); m = Read();
	for(int i = 1;i <= n;++ i)
		for(int j = 1;j <= m;++ j)
			for(int k = 0;k <= 1;++ k)
				dp[i][j][k] = INF;
	for(int i = 1;i <= n;++ i)
		scanf("%s",a[i]+1);
	int ans = dfs(1,1,0);
	if(ans > 0) printf("Takahashi");
	else if(ans < 0) printf("Aoki");
	else printf("Draw");
	return 0;
}
#include <bits/stdc++.h>

using namespace std;


int main() {
#ifndef LOCAL
    ios::sync_with_stdio(0);
    cin.tie(0);
#endif

    int h, w;
    cin >> h >> w;

    vector<string> field(h);
    for (auto &it : field) {
        cin >> it;
    }

    vector<vector<int>> score(h, vector<int>(w));

    auto getPlayer = [&](int y, int x) {
        return (y + x) % 2 == 0 ? 1 : -1;
    };

    map<char, int> symbol;
    symbol['+'] = 1;
    symbol['-'] = -1;

    for (int i = h - 2; i >= 0; i--) {
        score[i][w - 1] = score[i + 1][w - 1];
        score[i][w - 1] += symbol[field[i + 1][w - 1]] * getPlayer(i, w - 1);
    }
    for (int i = w - 2; i >= 0; i--) {
        score[h - 1][i] = score[h - 1][i + 1];
        score[h - 1][i] += symbol[field[h - 1][i + 1]] * getPlayer(h - 1, i);
    }
    for (int i = h - 2; i >= 0; i--) {
        for (int j = w - 2; j >= 0; j--) {
            int p = getPlayer(i, j);
            if (score[i + 1][j] * p > score[i][j + 1] * p || (score[i + 1][j] == score[i][j + 1] && field[i + 1][j] == '+' && field[i][j + 1] == '-')) {
                score[i][j] = score[i + 1][j];
                score[i][j] += symbol[field[i + 1][j]] * p;
            } else {
                score[i][j] = score[i][j + 1];
                score[i][j] += symbol[field[i][j + 1]] * p;
            }
        }
    }
    if (score[0][0] > 0) {
        cout << "Takahashi\n";
    } else if (score[0][0] < 0) {
        cout << "Aoki\n";
    } else {
        cout << "Draw\n";
    }
}
