#include <cstdio>
#include <iostream>
#include <cmath>
#include <ctype.h>
#include <string> 
#include <sstream>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <queue>
#include <utility>
#include <vector>
#include <set>
 
using namespace std;

void changepanel(int ***p, int px, int py, int newc, int t);
int count(int ***p, int t, int color, int x, int y);
void simulate(int ***p, int t);
bool isedge(int ***p, int x, int y, int t);

int h, w, c;

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

int ans;

bool ischecked[8][8];
bool ischanged[8][8];
bool iscounted[8][8];

int main()
{
    while(1){
        cin >> h >> w >> c;
        if(h == 0) break;
        ans = 0;
        int ***panel = new int**[h];
        for(int i = 0; i < h; i++) panel[i] = new int*[w];
        for(int i = 0; i < h; i++){
            for(int j = 0; j < w; j++){
                panel[i][j] = new int[6];
            }
        }
        for(int i = 0; i < h; i++){
            for(int j = 0; j < w; j++){
                cin >> panel[i][j][0];
            }
        }
        simulate(panel, 1);
        cout << ans << endl;
        delete[] panel;
    }
    return 0;
}

void changepanel(int ***p, int px, int py, int newc, int t)
{
    int nextx, nexty;
    int beforecolor = p[px][py][t];
    p[px][py][t] = newc;
    ischanged[px][py] = true;
    for(int i = 0; i < 4; i++){
        nextx = px + dx[i];
        nexty = py + dy[i];
        if(nextx >= h || nextx < 0 || nexty >= w || nexty < 0) continue;
        if(p[nextx][nexty][t] == beforecolor && !ischanged[nextx][nexty]) changepanel(p, nextx, nexty, newc, t);
    }
    return;
}

int count(int ***p, int t, int color, int x, int y)
{
    int ans = 0;
    if(iscounted[x][y]) ans++;
    for(int i = 0; i < 4; i++){
        int nextx = x + dx[i], nexty = y + dy[i];
        if(nextx >= h || nextx < 0 || nexty >= w || nexty < 0) continue;
        else if(p[nextx][nexty][t] == color && !iscounted[nextx][nexty]){
            iscounted[nextx][nexty] = true;
            ans += count(p, t, color, nextx, nexty);
        }else if(p[nextx][nexty][t] == c && !iscounted[nextx][nexty]){
            iscounted[nextx][nexty] = true;
            ans += count(p, t, c, nextx, nexty);
        }
    }
    return ans;
}

void simulate(int ***p, int t)
{
    if(w == 1 && h == 1){
        ans = 1;
        return;
    }
    if(t == 5) {
        // for(int i = 0; i < h; i++){
            // for(int j = 0; j < w; j++){
                // cout << " " << p[i][j][t - 1];
            // }
       //     cout << endl;
        // }
        // cout << endl;
        for(int i = 1; i < 7; i++){
            for(int j = 0; j < h; j++){
                for(int k = 0; k < w; k++){
                    iscounted[j][k] = false;
                }
            }
            if(p[0][0][t] == i) iscounted[0][0] = true;
            int a = 0;
            a = count(p, t - 1, i, 0, 0);
            // cout << a << endl;
            ans = max(ans, a);
            }
            // cout << ans << endl;
        return;
    }
    for(int i = 0; i < h; i++){
        for(int j = 0; j < w; j++){
            p[i][j][t] = p[i][j][t - 1];
        }
    }
    // for(int i = 0; i < h; i++){
        // for(int j = 0; j < w; j++){
            // cout << " " << p[i][j][t];
            // }
        // cout << endl;
    // }
    // cout << endl;
    int x = 0, y = 0;
    while(1){
        // cout << x << " " << y << endl;
        if(y == w) break;
        for(int i = 0; i < h; i++){
            for(int j = 0; j < w; j++){
                ischecked[i][j] = false;
                ischanged[i][j] = false;
            }
        }
        ischecked[x][y] = true;
        if(p[x][y][t] != p[0][0][t] && isedge(p, x, y, t)){
            for(int i = 0; i < h; i++){
                for(int j = 0; j < w; j++){
                    p[i][j][t] = p[i][j][t - 1];
                }
            }
            // パネルを一つ前の状態に戻しておく
            int newc = p[x][y][t];
            changepanel(p, 0, 0, newc, t);
            simulate(p, t + 1);
        } else {
            x++;
            if(x == h){
                y++;
                x = 0;
            }
        }
    }
    simulate(p, t + 1);
}
// あるパネルについて、隣り合ってるパネルの色以外の色でぬりかえることは無意味

bool isedge(int ***p, int x, int y, int t)
{
    if(x == 0 && y == 0) return true;
    bool ans = false;
    for(int i = 0; i < 4; i++){
        int nextx = x + dx[i];
        int nexty = y + dy[i];
        if(nextx >= h || nextx < 0 || nexty >= w || nexty < 0) continue;
        if(p[nextx][nexty][t] == p[0][0][t] && !ischecked[nextx][nexty]){
            ischecked[nextx][nexty] = true;
            ans = isedge(p, nextx, nexty, t);
            if(ans) break;
        }
    }
    return ans;
}

Measured memory_bytes: 1700