#include<bits/stdc++.h>
using namespace std;
const int N=110;
int a[N][N];
int f[N][N];//以(i,j)点为右下端点的最大正方形的边长
/*
如:a[i][j]
0 1 1 1 0
1 1 1 1 0
0 1 1 1 1
0 1 1 1 1
0 0 1 1 1
*/
/*
对应的:f[i][j]
0 1 1 1 0
1 1 2 2 0
0 1 2 3 1
0 1 2 3 2
0 0 1 2 3
*/
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
cin>>a[i][j];
int res=0;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(a[i][j])//只有当前的(i,j)为1时才可以更新以(i,j)点为右下端点的最大正方形的边长
f[i][j]=min(min(f[i][j-1],f[i-1][j]),f[i-1][j-1])+1;//由于当前的状态得从上方、左方以及左上方扩张,需要满足这三种情况所以选择最小值即可
res=max(res,f[i][j]);
}
}
cout<<res;
return 0;
}