#include <bits/stdc++.h>
#define dbg(x) cout << #x << "=" << x << endl
#define eps 1e-8
#define pi acos(-1.0)
using namespace std;
typedef long long LL;
const int inf = 0x3f3f3f3f;
template<class T>inline void read(T &res)
{
char c;T flag=1;
while((c=getchar())<‘0‘||c>‘9‘)if(c==‘-‘)flag=-1;res=c-‘0‘;
while((c=getchar())>=‘0‘&&c<=‘9‘)res=res*10+c-‘0‘;res*=flag;
}
namespace _buff {
const size_t BUFF = 1 << 19;
char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
char getc() {
if (ib == ie) {
ib = ibuf;
ie = ibuf + fread(ibuf, 1, BUFF, stdin);
}
return ib == ie ? -1 : *ib++;
}
}
int qread() {
using namespace _buff;
int ret = 0;
bool pos = true;
char c = getc();
for (; (c < ‘0‘ || c > ‘9‘) && c != ‘-‘; c = getc()) {
assert(~c);
}
if (c == ‘-‘) {
pos = false;
c = getc();
}
for (; c >= ‘0‘ && c <= ‘9‘; c = getc()) {
ret = (ret << 3) + (ret << 1) + (c ^ 48);
}
return pos ? ret : -ret;
}
const int maxn = 2577;
int n,m;
int a[maxn][maxn];
int f[maxn][maxn][2];
int main()
{
//freopen("data.txt", "r", stdin);
read(n);
read(m);
for ( int i = 1; i <= n; ++i ) {
for ( int j = 1; j <= m; ++j ) {
read(a[i][j]);
}
}
int ans = 0;
for ( int i = 1; i <= n; ++i ) {
for ( int j = 1; j <= m; ++j ) {
if(a[i][j]) {
int up = 0, rig = 0;
for ( int k = i - 1; k >= 1; --k ) {
if(a[k][j]) {
break;
}
++up;
}
for ( int k = j + 1; k <= m; ++k ) {
if(a[i][k]) {
break;
}
++rig;
}
f[i][j][1] = min(f[i - 1][j + 1][1], min(up, rig)) + 1;
//f[i][j][1] = min(f[i - 1][j + 1][1], min(up, rig)) + 1;
}
//printf("f[%d][%d]:%d\n",i, j, f[i][j][0]);
ans = max(ans, max(f[i][j][0], f[i][j][1]));
}
for ( int j = m; j >= 1; --j ) {
int up = 0, lef = 0;
if(a[i][j]) {
for ( int k = i - 1; k >= 1; --k ) {
if(a[k][j]) {
break;
}
++up;
}
for ( int k = j - 1; k >= 1; --k ) {
if(a[i][k]) {
break;
}
++lef;
}
f[i][j][0] = min(f[i - 1][j - 1][0], min(up, lef)) + 1;
// if(i == 3 && j == 6) {
// printf("up:%d lef:%d f[3][6][0]:%d\n",up, lef, f[3][6][0]);
// }
// if(i == 2 && j == 5) {
// printf("up:%d lef:%d f[2][5][0]:%d\n",up, lef, f[2][5][0]);
// }
// if(i == 1 && j == 4) {
// printf("up:%d lef:%d f[1][4][0]:%d\n",up, lef, f[1][4][0]);
// }
}
ans = max(ans, max(f[i][j][0], f[i][j][1]));
}
}
cout << ans << endl;
return 0;
}