#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <iostream>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;

struct Info{
	int group_label,member_num,adj_empty_num,adj_empty_row,adj_empty_col;
};

Info info[60];

struct Data{
	int data,stone_id;
};

Data table[10][10];

int N,C,group_num,stone_num;
int diff_row[6] = {-1,-1,0,0,1,1},diff_col[6] = {-1,0,-1,1,0,1};

bool rangeCheck(int row,int col){
	if(row < 0 || row >= N || col < 0 || col > row)return false;
	else{
		return true;
	}
}

int boss[60],height[60];

int get_boss(int id){
	if(boss[id] == id)return id;
	else{
		return boss[id] = get_boss(boss[id]);
	}
}

int is_same(int x,int y){
	return get_boss(x) == get_boss(y);
}

void unite(int x,int y){
	int boss_x = get_boss(x);
	int boss_y = get_boss(y);

	if(boss_x == boss_y)return;

	if(height[x] > height[y]){

		boss[boss_y] = boss_x;

	}else if(height[x] < height[y]){

		boss[boss_x] = boss_y;

	}else{ //height[x] == height[y]

		boss[boss_y] = boss_x;
		height[x]++;
	}
}

void init(){
	for(int i = 0; i < stone_num; i++){
		boss[i] = i;
		height[i] = 0;
	}
}

void func(){

	stone_num = 0;
	int stone_label[200];

	for(int row = 0; row < N; row++){
		for(int col = 0; col <= row; col++){
			scanf("%d",&table[row][col].data);
			if(table[row][col].data > 0){
				table[row][col].stone_id = stone_num;
				stone_label[stone_num] = table[row][col].data;
				stone_num++;
			}
		}
	}

	init();

	int adj_row,adj_col;

	for(int row = 0; row < N; row++){
		for(int col = 0; col <= row; col++){
			if(table[row][col].data > 0){
				for(int i = 0; i < 6; i++){
					adj_row = row + diff_row[i];
					adj_col = col + diff_col[i];
					if(rangeCheck(adj_row,adj_col) == true && table[adj_row][adj_col].data == table[row][col].data){
						unite(table[adj_row][adj_col].stone_id,table[row][col].stone_id);
					}
				}
			}
		}
	}

	int num[60],group_id[60];
	for(int i = 0; i < 60; i++)num[i] = 0;

	group_num = 0;

	for(int i = 0; i < stone_num; i++){
		if(get_boss(i) == i){
			group_id[boss[i]] = group_num;
			group_num++;
		}
		num[boss[i]]++;
	}

	for(int i = 0; i < stone_num; i++){
		if(boss[i] == i){
			info[group_id[boss[i]]].group_label = stone_label[i];
			info[group_id[boss[i]]].member_num = num[boss[i]];
		}
	}

	for(int i = 0; i < group_num; i++)info[i].adj_empty_num = 0;

	int tmp_id;

	for(int row = 0; row < N; row++){
		for(int col = 0; col <= row; col++){
			if(table[row][col].data > 0){
				for(int i = 0; i < 6; i++){
					adj_row = row + diff_row[i];
					adj_col = col + diff_col[i];
					if(rangeCheck(adj_row,adj_col) == true && table[adj_row][adj_col].data == 0){
						tmp_id = group_id[boss[table[row][col].stone_id]];
						if(info[tmp_id].adj_empty_num == 0){
							info[tmp_id].adj_empty_num++;
							info[tmp_id].adj_empty_row = adj_row;
							info[tmp_id].adj_empty_col = adj_col;
						}else{
							if(info[tmp_id].adj_empty_num == 1 && info[tmp_id].adj_empty_row == adj_row && info[tmp_id].adj_empty_col == adj_col){
								//Do nothing
							}else{
								info[tmp_id].adj_empty_num++;
							}
						}
					}
				}
			}
		}
	}

	int maximum = -1000,work[60],gain,lose;

	bool FLG,self_FLG;

	for(int row = 0; row < N; row++){
		for(int col = 0; col <= row; col++){
			if(table[row][col].data == 0){

				self_FLG = false;

				for(int i = 0; i < 6; i++){
					adj_row = row + diff_row[i];
					adj_col = col + diff_col[i];
					if(rangeCheck(adj_row,adj_col) == true && table[adj_row][adj_col].data == 0){
						self_FLG = true;
						break;
					}else if(rangeCheck(adj_row,adj_col) == true && table[adj_row][adj_col].data == C){
						if(info[group_id[boss[table[adj_row][adj_col].stone_id]]].adj_empty_num >= 2){
							self_FLG = true;
							break;
						}
					}
				}


				for(int i = 0; i < group_num; i++)work[i] = 0;

				for(int i = 0; i < 6; i++){
					adj_row = row + diff_row[i];
					adj_col = col + diff_col[i];
					if(rangeCheck(adj_row,adj_col) == true && table[adj_row][adj_col].data > 0 && table[adj_row][adj_col].data != C){
						tmp_id = group_id[boss[table[adj_row][adj_col].stone_id]];
						if(info[tmp_id].adj_empty_num == 1){
							work[tmp_id] = info[tmp_id].member_num;
						}else{
							//Do nothing
						}
					}
				}

				gain = 0;
				for(int i = 0; i < group_num; i++)gain += work[i];

				for(int i = 0; i < group_num; i++)work[i] = 0;

				FLG = false;
				for(int i = 0; i < 6; i++){
					adj_row = row + diff_row[i];
					adj_col = col + diff_col[i];
					if(rangeCheck(adj_row,adj_col) == true && table[adj_row][adj_col].data == C){
						tmp_id = group_id[boss[table[adj_row][adj_col].stone_id]];
						if(info[tmp_id].adj_empty_num == 1){
							work[tmp_id] = info[tmp_id].member_num;
						}else{
							FLG = true;
						}
					}
				}

				if(self_FLG)lose = 0;
				else{
					lose = 1;
				}

				if(!FLG){
					for(int i = 0; i < group_num; i++)lose += work[i];
				}

				maximum = max(maximum,gain-lose);

			}
		}
	}

	printf("%d\n",maximum);

}


int main(){

	while(true){
		scanf("%d %d",&N,&C);
		if(N == 0 && C == 0)break;

		func();
	}

	return 0;
}

Measured memory_bytes: 3080