/** made by amunduzbaev **/

#include <bits/stdc++.h>
using namespace std;
 
#define ff first
#define ss second
#define pb push_back
#define mp make_pair
#define ub upper_bound
#define lb lower_bound
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(),x.rend()
#define NeedForSpeed ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define vv vector
#define tut(x) array<int, x> 
#define int long long
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii; 
typedef vector<int> vii;
typedef vector<pii> vpii;
template<class T> bool umin(T& a, const T& b) {return a > b? a = b, true:false;}
template<class T> bool umax(T& a, const T& b) {return a < b? a = b, true:false;}
void fropen(string s) {  freopen((s+".in").c_str(),"r",stdin);  freopen((s+".out").c_str(),"w",stdout);  }
 
const int N = 3e5+5; 
const int mod = 1e9+7;
const ll inf = 1e18;
const ld Pi = acos(-1);

#define MULTI 0
int n, m, k, res, ans, a[N];

void solve(int t_case){
	cin>>n>>k;
	for(int i=0;i<n;i++) cin>>a[i];
	sort(a, a+n);
	multiset<int> ss;
	for(int i=0;i<k;i++) ss.insert(0);
	for(int i=0;i<n;i++){
		auto pos = ss.find(a[i]);
		if(pos != ss.end()){
			ss.erase(pos);
			ss.insert(a[i]+1);
		}
		//for(auto x:ss) cout<<x<<" ";
		//cout<<"\n";
	}
	for(auto x:ss) res += x;
	cout<<res<<"\n";
}

signed main(){
	NeedForSpeed
	
	if(!MULTI) {
		solve(1);
	} else {
		int t; cin>>t;
		for(int t_case = 1; t_case <= t; t_case++) solve(t_case);
	}
	return 0;
}

  #include<bits/stdc++.h>
  using namespace std;
  using ll = long long;
  #define rep(i,f,n) for(ll i=(f); (i) < (n); i++)
  #define repe(i,f,n) for(ll i=(f); (i) <= (n); i++)
  #define repc(i,f,n) for(char i=(f); (i) <= (n); i++)
  #define PI 3.14159265358979323846264338327950ll
  #define debug(x) cout<<#x<<" :: "<<x<<"\n";
  #define debug2(x,y) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\n";
  #define debug3(x,y,z) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\t"<<#z<<" :: "<<z<<"\n";
  #define Pl pair<ll, ll>
  #define dvec vector<vector<ll>>
  #define OUT(x) cout << x << endl; return 0;
  //printf("%.10f\n")
  //cout << fixed << setprecision(10);
  template<class T> inline bool chmax(T& a, T b){if (a < b) { a = b; return true; } return false;}
  template<class T> inline bool chmaxe(T& a, T b){if (a <= b) { a = b; return true; } return false;}
  template<class T> inline bool chmin(T& a, T b){if (a > b) { a = b; return true; } return false;}
  const ll MOD = 1000000007ll;
  const ll INF = 1e+18;
  const int iINF = 1e9;
  const double EPS = 1e-8;


int
main()
{
  ll H, W; cin >> H >> W;
  vector<string> grd(H);
  rep(i, 0, H){
    cin >> grd[i];
  }
  vector<vector<ll>> dp(H, vector<ll>(W, -INF));
  dp[H - 1][W - 1] = 0;

  for(ll h = H - 1; h >= 0; h -= 1){
    for(ll w = W - 1; w >= 0; w -= 1){
      if((h + w) % 2 == 0){
        ll cmp = -INF;
        if(h + 1 < H) chmax(cmp, dp[h + 1][w] + (grd[h + 1][w] == '+' ? 1 : -1));
        if(w + 1 < W) chmax(cmp, dp[h][w + 1] + (grd[h][w + 1] == '+' ? 1 : -1));
        if(cmp != -INF)dp[h][w] = cmp;
      } else {
        ll cmp = INF;
        if(h + 1 < H) chmin(cmp, dp[h + 1][w] + (grd[h + 1][w] == '+' ? -1 : 1));
        if(w + 1 < W) chmin(cmp, dp[h][w + 1] + (grd[h][w + 1] == '+' ? -1 : 1));
        if(cmp != INF)dp[h][w] = cmp;
      }
    }
  }
   
  ll rt = dp[0][0];
  if(rt == 0){OUT("Draw")}
  else if(rt > 0){OUT("Takahashi")}
  else{OUT("Aoki")}
}