/**
 *    author:  otera    
**/
#include<iostream>
#include<string> 
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<algorithm> 
#include<functional>
#include<iomanip>
#include<queue>
#include<deque>
#include<ciso646>
#include<random>
#include<map>
#include<set>
#include<complex>
#include<bitset>
#include<stack>
#include<unordered_map>
#include<utility>
#include<cassert>
using namespace std;

//#define int long long
typedef long long ll;
typedef unsigned long long ul;
typedef unsigned int ui;
typedef long double ld;
const int inf=1e9+7;
const ll INF=1LL<<60 ;
const ll mod=1e9+7 ;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define Rep(i,sta,n) for(int i=sta;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define per1(i,n) for(int i=n;i>=1;i--)
#define Rep1(i,sta,n) for(int i=sta;i<=n;i++)
typedef complex<ld> Point;
const ld eps = 1e-8;
const ld pi = acos(-1.0);
typedef pair<int, int> P;
typedef pair<ld, ld> LDP;
typedef pair<ll, ll> LP;
#define fr first
#define sc second
#define all(c) c.begin(),c.end()
#define pb push_back
#define debug(x)  cerr << #x << " = " << (x) << endl;
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }

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

int dfs(vector<vector<int>> p, int x, int c) {
    int h = p.size(), w = p[0].size();
    int ret = 0;
    for(int i = 1; i <= 6; ++ i) {
        if(x == 4 and c != i) continue;
        vector<vector<int>> q = p;
        queue<P> que;
        que.push(P{1, 1});
        vector<vector<bool>> used(h, vector<bool>(w, 0));
        int col = q[1][1];
        q[1][1] = i;
        used[1][1] = 1;
        while(que.size()) {
            P p = que.front(); que.pop();
            int xx = p.fr, y = p.sc;
            rep(k, 4) {
                int nx = xx + dx[k], ny = y + dy[k];
                if(q[nx][ny] == col and !used[nx][ny]) {
                    q[nx][ny] = i;
                    used[nx][ny] = 1;
                    que.push({nx, ny});
                }
            }
        }
        if(x == 4 and c == i) {
            int cnt = 1;
            que.push(P{1, 1});
            used.assign(h, vector<bool>(w, 0));
            used[1][1] = 1;
            while(que.size()) {
                P p = que.front(); que.pop();
                int xx = p.fr, y = p.sc;
                rep(k, 4) {
                    int nx = xx + dx[k], ny = y + dy[k];
                    if(q[nx][ny] == i and !used[nx][ny]) {
                        used[nx][ny] = 1;
                        ++ cnt;
                        que.push({nx, ny});
                    }
                }
            }
            return cnt;
        }
        chmax(ret, dfs(q, x + 1, c));
    }
    return ret;
}

void solve() {
    int h, w, c;
	while(cin >> h >> w >> c) {
        if(h == 0 and w == 0 and c == 0) break;
        vector<vector<int>> p(h + 2, vector<int>(w + 2, 0));
        rep(i, h) {
            rep(j, w) {
                cin >> p[i + 1][j + 1];
            }
        }
        cout << dfs(p, 0, c) << endl;
    }
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	//cout << fixed << setprecision(10);
	//int t; cin >> t; rep(i, t)solve();
	solve();
    return 0;
}


Measured memory_bytes: 3196