#include<stdio.h>
#define MAX 200
int p[6][MAX],stack[6][MAX],indexSTACK[6];
int h,w,c,max;

void STACKpush(int,int);
void colorChange(int,int);
void stackPanelR(int,int);
void stackPanel(int);
void panelR(int);
int panel();

int main(void){
  int i;
  while(1){
    scanf("%d %d %d",&h,&w,&c);
    if(h==0&&w==0&&c==0)break;
    for(i=0;i<h*w;i++)scanf("%d",&p[0][i]);
    printf("%d\n",panel());
  }
  return 0;
}

void STACKpush(int n,int item){
  int j;
  for(j=0;j<indexSTACK[n];j++){
      if(item==stack[n][j])return;
    }
  stack[n][indexSTACK[n]++]=item;
}

void colorChange(int n,int color){
  int i;
  for(i=0;i<w*h;i++)p[n+1][i]=p[n][i];
  for(i=0;i<indexSTACK[n];i++){
    p[n+1][stack[n][i]]=color;
  }
}
void stackPanelR(int n,int point){
  int i,j,nextX,nextY,next;
  int x=point%w;int y=point/w;
  int directionX[4]={-1,0,1,0};//左,上,右,下
  int directionY[4]={0,-1,0,1};
  for(i=0;i<4;i++){
    nextX=x+directionX[i];
    nextY=y+directionY[i];
    if(nextX<0 || nextX>=w)continue;
    if(nextY<0 || nextY>=h)continue;
    next=nextX+nextY*w;
    int judge=1;
    for(j=0;j<indexSTACK[n];j++){
      if(next==stack[n][j])judge=-1;
    }
    if(judge==-1)continue;
    if(p[n][0]==p[n][next]){
      STACKpush(n,next);
      stackPanelR(n,next);
    }
  }
}
void stackPanel(int n){
  indexSTACK[n]=0;
  STACKpush(n,0);
  if(1<w && p[n][0]==p[n][1]){
    STACKpush(n,1);
    stackPanelR(n,1);
  }
  if(1<h && p[n][0]==p[n][w]){
    STACKpush(n,w);
    stackPanelR(n,w);
  }
}

void panelR(int n){
  int i;
  stackPanel(n);
  if(n==5){
    if(indexSTACK[n]>max)max=indexSTACK[n];
    return; 
  }
  for(i=1;i<=6;i++){
    if(p[n][0]==i)continue;
    if(n==4)colorChange(n,c);
    else{
      if(n==3&&i==c)continue;
      colorChange(n,i);
    }
    panelR(n+1);
  }
}

int panel(){
  max=0;
  panelR(0);
  return max;
}