//#pragma GCC optimize("O3")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
#define is insert
#define pb push_back
#define pii pair<int, int>
#define pll pair<long long, long long>
#define X first
#define Y second
#define vi vector<int>
#define vpi vector<pair<int, int>>
#define msi multiset<int>
#define int long long
const int m97 = (int)1e9+7;
const int m83 = 998244353;
const int N = 1005;
const int K = 30;
const int inf = (int)1e18;
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int n, m;
int a[N][N];
int h[N], l[N], r[N];
void solve(){
cin >> n >> m;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
cin >> a[i][j];
}
}
if(n <= 20){
int mx = 0;
for(int i1=1; i1<=n; i1++){
for(int j1=1; j1<=m; j1++){
for(int i2 = 1; i2 <= i1; i2++){
for(int j2 = 1; j2 <= j1; j2++){
bool ok = 1;
int tar = a[i1][j1];
for(int curi = i2; curi <= i1; curi++){
for(int curj = j2; curj <= j1; curj++){
ok &= (a[curi][curj] == tar);
}
}
if(ok){
mx = max((i1 - i2 + 1 + j1 - j2 + 1) * 2, mx);
}
}
}
}
}
cout << mx << "\n";
}
else{
int mx = 0;
for(int cur = 0; cur <= 9; cur++){
fill(h + 1, h + m + 1, 0);
fill(l + 1, l + m + 1, 1);
fill(r + 1, r + m + 1, m + 1);
for(int i=1; i <=n; i++){
for(int j=1; j<=m; j++){
h[j] = (a[i][j] == cur ? h[j] + 1 : 0);
}
int cl = 1;
for(int j=1; j<=m; j++){
if(a[i][j] == cur){
l[j] = max(l[j], cl);
}
else{
l[j] = 1;
cl = j + 1;
}
}
int cr = m + 1;
for(int j=m; j>=1; j--){
if(a[i][j] == cur){
r[j] = min(r[j], cr);
}
else{
r[j] = m + 1;
cr = j;
}
}
for(int j=1; j <= m; j++){
int ch = h[j];
int cw = r[j] - l[j];
if(ch > 0 && cw > 0){
mx = max(mx, (ch + cw) * 2);
}
}
}
}
cout << mx;
}
}
signed main(){
freopen("FLATLAND.INP", "r", stdin);
freopen("FLATLAND.OUT", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int tt = 1; //cin >> tt;
while(tt--){
solve();
}
}
/*
sample
*/
Ly8jcHJhZ21hIEdDQyBvcHRpbWl6ZSgiTzMiKQovLyNwcmFnbWEgR0NDIG9wdGltaXplKCJPZmFzdCIpCi8vI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGRiIGRvdWJsZQojZGVmaW5lIGlzIGluc2VydAojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIHBpaSBwYWlyPGludCwgaW50PgojZGVmaW5lIHBsbCBwYWlyPGxvbmcgbG9uZywgbG9uZyBsb25nPgojZGVmaW5lIFggZmlyc3QKI2RlZmluZSBZIHNlY29uZAojZGVmaW5lIHZpIHZlY3RvcjxpbnQ+CiNkZWZpbmUgdnBpIHZlY3RvcjxwYWlyPGludCwgaW50Pj4KI2RlZmluZSBtc2kgbXVsdGlzZXQ8aW50PgojZGVmaW5lIGludCBsb25nIGxvbmcKY29uc3QgaW50IG05NyA9IChpbnQpMWU5Kzc7CmNvbnN0IGludCBtODMgPSA5OTgyNDQzNTM7CmNvbnN0IGludCBOID0gMTAwNTsKY29uc3QgaW50IEsgPSAzMDsKY29uc3QgaW50IGluZiA9IChpbnQpMWUxODsKCi8vbXQxOTkzNyBybmcoY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKCmludCBuLCBtOwppbnQgYVtOXVtOXTsKaW50IGhbTl0sIGxbTl0sIHJbTl07Cgp2b2lkIHNvbHZlKCl7CgljaW4gPj4gbiA+PiBtOwoJZm9yKGludCBpPTE7IGk8PW47IGkrKyl7CgkJZm9yKGludCBqPTE7IGo8PW07IGorKyl7CgkJCWNpbiA+PiBhW2ldW2pdOwoJCX0KCX0KCWlmKG4gPD0gMjApewoJCWludCBteCA9IDA7CgkJZm9yKGludCBpMT0xOyBpMTw9bjsgaTErKyl7CgkJCWZvcihpbnQgajE9MTsgajE8PW07IGoxKyspewoJCQkJZm9yKGludCBpMiA9IDE7IGkyIDw9IGkxOyBpMisrKXsKCQkJCQlmb3IoaW50IGoyID0gMTsgajIgPD0gajE7IGoyKyspewoJCQkJCQlib29sIG9rID0gMTsKCQkJCQkJaW50IHRhciA9IGFbaTFdW2oxXTsKCQkJCQkJZm9yKGludCBjdXJpID0gaTI7IGN1cmkgPD0gaTE7IGN1cmkrKyl7CgkJCQkJCQlmb3IoaW50IGN1cmogPSBqMjsgY3VyaiA8PSBqMTsgY3VyaisrKXsKCQkJCQkJCQlvayAmPSAoYVtjdXJpXVtjdXJqXSA9PSB0YXIpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWlmKG9rKXsKCQkJCQkJCW14ID0gbWF4KChpMSAtIGkyICsgMSArIGoxIC0gajIgKyAxKSAqIDIsIG14KTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQljb3V0IDw8IG14IDw8ICJcbiI7Cgl9CgllbHNlewoJCWludCBteCA9IDA7CgkJZm9yKGludCBjdXIgPSAwOyBjdXIgPD0gOTsgY3VyKyspewoJCQlmaWxsKGggKyAxLCBoICsgbSArIDEsIDApOwoJCQlmaWxsKGwgKyAxLCBsICsgbSArIDEsIDEpOwoJCQlmaWxsKHIgKyAxLCByICsgbSArIDEsIG0gKyAxKTsKCQkJZm9yKGludCBpPTE7IGkgPD1uOyBpKyspewoJCQkJZm9yKGludCBqPTE7IGo8PW07IGorKyl7CgkJCQkJaFtqXSA9IChhW2ldW2pdID09IGN1ciA/IGhbal0gKyAxIDogMCk7CgkJCQl9CgkJCQlpbnQgY2wgPSAxOwoJCQkJZm9yKGludCBqPTE7IGo8PW07IGorKyl7CgkJCQkJaWYoYVtpXVtqXSA9PSBjdXIpewoJCQkJCQlsW2pdID0gbWF4KGxbal0sIGNsKTsKCQkJCQl9CQoJCQkJCWVsc2V7CgkJCQkJCWxbal0gPSAxOwoJCQkJCQljbCA9IGogKyAxOwoJCQkJCX0KCQkJCX0KCQkJCWludCBjciA9IG0gKyAxOwoJCQkJZm9yKGludCBqPW07IGo+PTE7IGotLSl7CgkJCQkJaWYoYVtpXVtqXSA9PSBjdXIpewoJCQkJCQlyW2pdID0gbWluKHJbal0sIGNyKTsKCQkJCQl9CgkJCQkJZWxzZXsKCQkJCQkJcltqXSA9IG0gKyAxOwoJCQkJCQljciA9IGo7CgkJCQkJfQoJCQkJfQoJCQkJZm9yKGludCBqPTE7IGogPD0gbTsgaisrKXsKCQkJCQlpbnQgY2ggPSBoW2pdOwoJCQkJCWludCBjdyA9IHJbal0gLSBsW2pdOwoJCQkJCWlmKGNoID4gMCAmJiBjdyA+IDApewoJCQkJCQlteCA9IG1heChteCwgKGNoICsgY3cpICogMik7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCWNvdXQgPDwgbXg7Cgl9Cn0KCnNpZ25lZCBtYWluKCl7CglmcmVvcGVuKCJGTEFUTEFORC5JTlAiLCAiciIsIHN0ZGluKTsKICAgIGZyZW9wZW4oIkZMQVRMQU5ELk9VVCIsICJ3Iiwgc3Rkb3V0KTsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiAgICBpbnQgdHQgPSAxOyAvL2NpbiA+PiB0dDsKICAgIHdoaWxlKHR0LS0pewogICAgCXNvbHZlKCk7Cgl9Cn0KCi8qCnNhbXBsZQoKCgoqLwo=