#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m, a[1505][1505], dp[1505][1505], d[1505][1505], ans;
int dfs(int x, int y)
{
if (a[x][y]==0)
{
return 0;
}
if (dp[x][y])
{
return dp[x][y];
}
int MAX = 1, q = 0;
for (int p=1;p<=min(n-x, m-y);p++)
{
if (a[x][y+p]==((p+1)%2)&&a[x+p][y]==((p+1)%2))
{
q = p+1;
}
else
{
break;
}
}
MAX = max(MAX, min(1+dfs(x+1, y+1), q));
return dp[x][y]=MAX;
}
int f(int x, int y)
{
if (a[x][y]==1)
{
return 0;
}
if (d[x][y])
{
return d[x][y];
}
int MAX = 1, q = 0;
for (int p=1;p<=min(n-x, m-y);p++)
{
if (a[x][y+p]==(p%2)&&a[x+p][y]==(p%2))
{
q = p+1;
}
else
{
break;
}
}
MAX = max(MAX, min(1+f(x+1, y+1), q));
return d[x][y]=MAX;
}
int main()
{
cin>>n>>m;
for (int p=1;p<=n;p++)
{
for (int k=1;k<=m;k++)
{
cin>>a[p][k];
}
}
for (int p=1;p<=n;p++)
{
for (int k=1;k<=m;k++)
{
ans = max(ans, dfs(p, k));
ans = max(ans, f(p, k));
}
}
cout<<ans;
return 0;
}