#include<iostream>
#include<cassert>
#include<cmath>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
const int N = 8;
const int inf = 30000000;
int fp;
int dp[3][1<<N][1<<N][N];
int bit[1<<N];
int m[N][N];
int end;

inline int getPoint(int who,int i,int last){
  if (who == -1)return fp;
  if (who == 0)return m[i][last];
  return m[last][i];
}

/*
  お互いにベストを尽くした時の結果の差を求める。
  初手 -1,
  st1の人、   0
  st2の人、   1
 */
int solve(int n,int iswin,int st1,int st2,int last){
  if (st1 == end && st1 == st2){
    return 0;
  }
  int &ret = dp[iswin][st1][st2][last];
  if (ret != -inf)return ret;

  int who = (bit[st1] == bit[st2])?0:1;
  if (st1 == 0 && st2 == 0)who = -1;
  int nextiswin = iswin==2?2:1^iswin;/*2,1なら勝てるように戦う、0なら負けるように戦う*/
  if (iswin == 1 || iswin == 2)ret = -inf;
  else ret = inf;
  rep(i,n){
    int nextst1=st1,nextst2=st2;
    if (who == 0 || who == -1){//先手
      if (st1&(1<<i))continue;
      nextst1 |= (1<<i);
    }else{
      if (st2&(1<<i))continue;
      nextst2 |= (1<<i);
    }
    int point = getPoint(who,i,last);
    if (iswin == 0){/*負けるなら点差が最小になるように*/
      ret = min(ret,point-solve(n,nextiswin,nextst1,nextst2,i));
    }else {/*勝つなら、点差が最大になるように。*/
      ret = max(ret,point-solve(n,nextiswin,nextst1,nextst2,i));
    }
  }
  return ret;
}

/*
自分が本気、相手が負けるようにやっても勝てないならば、どうやっても勝てない
  初手 -1,
  st1の人、   0
  st2の人、   1
*/
int search(int n,int iswin,int st1,int st2,int last,int diff,int alpha,int beta){
  int turn = bit[st1] + bit[st2];
  if (st1 == end && st1 == st2){
    return turn;
  }
  if (diff + solve(n,1,st1,st2,last) < 0)return turn + 1;/*どう頑張っても負ける場合、ここで打ち切る。*/
  int ret;
  if (iswin)ret = inf;//勝つなら、最小手数を探す
  else ret = -inf;//負けるなら、最大になる手数を選ぶ。
  int who = bit[st1] == bit[st2]?0:1;
  if (st1 == 0 && st2 == 0)who = -1;
  int nextwin = 1^iswin;
  rep(i,n){
    int nextst1=st1,nextst2=st2;
    if (who == 0 || who == -1){//先手
      if (st1&(1<<i))continue;
      nextst1 |= (1<<i);
    }else{
      if (st2&(1<<i))continue;
      nextst2 |= (1<<i);
    }
    int point = getPoint(who,i,last);
    if (iswin == 1){/*勝つなら最小の手数を選択する。*/
      if (diff + point - solve(n,2,nextst1,nextst2,i) <= 0)continue;/*負ける手に遷移しないようにする*/
      ret = min(ret,search(n,nextwin,nextst1,nextst2,i,-point-diff,alpha,ret));
      beta = min(ret,beta);
      if (ret <= alpha){
	break;
      }
    }else{/*負けるなら最大の手数を選択する。*/
      ret = max(ret,search(n,nextwin,nextst1,nextst2,i,-point-diff,ret,beta));
      alpha = max(ret,alpha);
      if (ret >= beta){
	break;
      }
    }
  }
  return ret;
}

main(){
  int n;
  rep(i,(1<<N))bit[i] = __builtin_popcount(i);
  while(cin>>n>>fp && n){
    end = (1<<n)-1;
    rep(i,n)rep(j,n)cin>>m[i][j];
    rep(ii,3)rep(i,(1<<n))rep(j,(1<<n))rep(k,n)dp[ii][i][j][k] = -inf;
    int ans = solve(n,2,0,0,0),step;
    if (ans > 0){
      cout << "First" << endl;
      step = search(n,1,0,0,0,0,-inf,inf);
      cout << step << endl;
    }else if (ans < 0){
      cout << "Second" << endl;
      step = search(n,0,0,0,0,0,-inf,inf);
      cout << step << endl;
    }else if (ans == 0){
      cout << "Draw" << endl;
      cout << 2*n << endl;
    }
  }
  return 0;
}

Measured memory_bytes: 7012