#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <set>
#include <queue>
#include <sstream>
using namespace std;

#define MAX 15

const int dx[] = {1, 0, -1, 0, 1};
const int dy[] = {0, 1, 0, -1, 1};

const int dx2[] = {1, 0, -1, 0, -1, 1, 0};
const int dy2[] = {0, -1, -1, 1, 0, 1, 0};

int N, C;
int field[MAX][MAX];
bool used[MAX][MAX];
int group[MAX][MAX];
int group2[MAX][MAX];
int cnt = 1;

void init(){
  memset(field, 0, sizeof(field));
  memset(used, 0, sizeof(used));
  memset(group, 0, sizeof(group));
  memset(group2, 0, sizeof(group2));
  cnt = 1;
}

struct State{
  int x, y, n, cost;
  State(int x, int y, int n, int cost) : x(x), y(y), n(n), cost(cost){}
};

bool isField(int y, int x){
  if(y < 0 || x < 0 || x >= N || y >= N) return false;
  if(x > y) return false;
  return true;
}

void bfs(int x, int y, int n){
  queue<State> que;
  que.push(State(x, y, n, 1));
  
  int Max = 0;
  int cost = 0;
  
  while(!que.empty()){
    State q = que.front(); que.pop();
    
    //Max = max(Max, q.cost);
    if(used[q.y][q.x]) continue;
    used[q.y][q.x] = true;
    cost++;
    Max = max(Max, cost);
    
    for(int i = 0 ; i < 5 ; i++){
      int nx = q.x + dx[i], ny = q.y + dy[i];
      if(!isField(ny, nx)) continue;
      if(field[ny][nx] == q.n){
	que.push(State(nx, ny, n, q.cost+1));
      }
    }
  }
  
  que.push(State(x, y, n, 0));
  
  bool used2[MAX][MAX];
  memset(used2, false, sizeof(used2));
  
  while(!que.empty()){
    State q = que.front(); que.pop();
    
    if(used2[q.y][q.x]) continue;
    used2[q.y][q.x] = true;
    group[q.y][q.x] = Max;
    group2[q.y][q.x] = cnt;
    
    for(int i = 0 ; i < 5 ; i++){
      int nx = q.x + dx[i], ny = q.y + dy[i];
      if(!isField(ny, nx)) continue;
      if(field[ny][nx] == q.n){
	que.push(State(nx, ny, n, q.cost+1));
      }
    }    
  }
}

void Output(){
  cout << "C = " << C << endl;
  for(int i = 0 ; i < N ; i++){
    for(int j = 0 ; j <= i ; j++){
      cout << field[i][j] << ' ';
    }
    cout << endl;
  }
  cout << endl;
  
  for(int i = 0 ; i < N ; i++){
    for(int j = 0 ; j <= i ; j++){
      cout << group[i][j] << ' ';
    }
      cout << endl;
  }
  
  cout << endl;
  
  for(int i = 0 ; i < N ; i++){
    for(int j = 0 ; j <= i ; j++){
      cout << group2[i][j] << ' ';
    }
    cout << endl;
  }  
  
}

bool isRemove(int x, int y, int n){
  queue<State> que;
  que.push(State(x, y, n, 0));
  
  bool used2[MAX][MAX];
  memset(used2, false, sizeof(used2));
  
  while(!que.empty()){
    State q = que.front(); que.pop();
    
    if(used2[q.y][q.x]) continue;
    used2[q.y][q.x] = true;
    
    for(int i = 0 ; i < 6 ; i++){
      int nx = q.x + dx2[i], ny = q.y + dy2[i];
      if(!isField(ny, nx)) continue;
      if(field[ny][nx] == 0) return false;
      if(field[ny][nx] != q.n) continue;
      que.push(State(nx, ny, q.n, 0));
    }
  }
  return true;
}

int main(){
  string in;
  while(cin >> N >> C, N|C){
    cin.ignore();
    init();
    for(int i = 0 ; i < N ; i++){
      getline(cin, in);
      stringstream ss;
      ss << in;
      int n;
      int j = 0;
      while(ss >> n){
	field[i][j++] = n;
      }
    }
    
    for(int i = 0 ; i < N ; i++){
      for(int j = 0 ; j <= i ; j++){
	if(!used[i][j] && field[i][j] != 0){
	  bfs(j, i, field[i][j]);
	  cnt++;
	}
      }
    }
    
    
    int ans = -(1<<29);
    for(int i = 0 ; i < N ; i++){
      for(int j = 0 ; j <= i ; j++){
	if(field[i][j] == 0){
	  field[i][j] = C;
	  int sum = 0;
	  pair<int, int> plus[MAX*MAX];
	  memset(plus, 0, sizeof(plus));
	  
	  for(int d = 0 ; d < 6 ; d++){
	    int nx = j + dx2[d], ny = i + dy2[d];
	    if(!isField(ny, nx)) continue;
	    if(isRemove(nx, ny, field[ny][nx])){
	      plus[ group2[ny][nx] ].first = max(plus[ group2[ny][nx] ].first, group[ny][nx]);
	      plus[ group2[ny][nx] ].second = field[ny][nx];
	    }
	  }
	  
	  
	  if(isRemove(j, i, field[i][j])){
	    plus[ group2[i][j] ].first = max(plus[ group2[i][j] ].first, max(group[i][j], 1));
	    plus[ group2[i][j] ].second = field[i][j];
	  }
	  
	  
	  //cout << endl;
	  for(int k = 0 ; k < MAX*MAX ; k++){	    
	    if(plus[k].second == C) sum -= plus[k].first;
	    else sum += plus[k].first;
	    if(plus[k].first){
	      //cout << "k = " << plus[k].second << ": " << plus[k].first << endl;
	      //cout << "i = " << i << ", j = " << j << endl;
	    }
	  }
	  //cout << endl;
	  
	  bool flag = false;
	  for(int k = 0 ; k < MAX*MAX ; k++){
	    if(plus[k].first) flag = true;
	  }
	  //if(flag) ans = max(ans, sum);
	  ans = max(ans, sum);
	  field[i][j] = 0;
	}
      }
    }
    
    //Output();
    cout << ans << endl;
  }
    return 0;
}

Measured memory_bytes: 1236