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

template<typename T>
ostream& operator<<(ostream &os, vector<T> &v){
    string sep = " ";
    if(v.size()) os << v[0];
    for(int i=1; i<v.size(); i++) os << sep << v[i];
    return os;
}

template<typename T>
istream& operator>>(istream &is, vector<T> &v){
    for(int i=0; i<v.size(); i++) is >> v[i];
    return is;
}

#ifdef DBG
void debug_(){ cout << endl; }
template<typename T, typename... Args>
void debug_(T&& x, Args&&... xs){
    cout << x << " "; debug_(forward<Args>(xs)...);
}
#define dbg(...) debug_(__VA_ARGS__)
#else
#define dbg(...)
#endif

int main() {
    ios_base::sync_with_stdio(false);
    cout << setprecision(20) << fixed;

    int h, w;
    cin >> h >> w;
    vector<string> a(h);
    cin >> a;

    vector<vector<int>> score(h, vector<int>(w));
    for(int x=h-1; x>=0; x--){
        for(int y=w-1; y>=0; y--){
            if(x==h-1&&y==w-1) continue;
            score[x][y] = -1e9;

            if(x<h-1){
                int p = a[x+1][y]=='+'?1:-1;
                score[x][y] = max(score[x][y], p-score[x+1][y]);
            }

            if(y<w-1){
                int p = a[x][y+1]=='+'?1:-1;
                score[x][y] = max(score[x][y], p-score[x][y+1]);
            }
        }
    }

    if(score[0][0]>0) cout << "Takahashi" << endl;
    else if(score[0][0]<0) cout << "Aoki" << endl;
    else cout << "Draw" << endl;

    return 0;
}
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;
using namespace std;

#define endl '\n'
#define int long long int
#define rep(i, a, b) for (int i = a; i < b; i++)
#define revrep(i, a, b) for (int i = a; i >= b; i--)
#define pb push_back
#define pii pair<int, int>
#define vi vector<int>
#define vii vector<pii>
#define min3(a, b, c) min(a, min(b, c))
#define max3(a, b, c) max(a, max(b, c))

template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template <typename T>
using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;

ostream &operator<<( ostream &output, const pii &p ) { output << p.first << " " << p.second;return output; }
istream &operator>>( istream &input, pii &p ) { input >> p.first >> p.second;return input; }
template<typename T>
void inline println(vector<T> args){ for(T i: args)cout<<i<<" ";cout<<endl; }
void amax(int& a, int b) { a = max(a, b); }
void amin(int& a, int b) { a = min(a, b); }
int ceilInt(int a, int b) {
    if(!b) return 0;
    if(a%b) return a/b + 1;
    return a/b;
}

int INF = 1e18;
int MOD = 998244353;


void solve()
{
    int n, m, w; cin>>n>>m>>w;
    vi minCol(n, m), minRow(m, n);
    vector<vi> obsRow(m), obsCol(n);
    rep(t, 0, w) {
        int i, j; cin>>i>>j;
        i--, j--;
        minCol[i] = min(minCol[i], j);
        minRow[j] = min(minRow[j], i);
        obsRow[j].pb(i);
        obsCol[i].pb(j);
    }
    int ans = 0, extra = 0;
    ordered_set<int> os;
    rep(j, 0, minCol[0]){
        ans += minRow[j];
        int key = min(minRow[j], minRow[0]);
        extra += max(0LL, key-(int)os.order_of_key(key));
        for(int i: obsRow[j]) os.insert(i);
    }
    os.clear();
    rep(i, 0, minRow[0]) {
        ans += minCol[i];
        int key = min(minCol[i], minCol[0]);
        extra += max(0LL, key-(int)os.order_of_key(key));
        for(int j: obsCol[i]) os.insert(j);
    }
    cout<<ans-extra/2<<endl;
}   

signed main()
{

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t = 1;
    // cin >> t;
    rep(i, 0, t)
    {
        solve();
    }
    return 0;
}
