#include <cstring>
#include <cstdio>
#define ms(i,j) memset(i,j,sizeof i);
using namespace std;

int n,m,left[2505][2505],right[2505][2505],up[2505][2505],dp[2505][2505],ans,map[2505][2505];
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a>b?b:a;}
int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        ans=0;
        ms(map,0);ms(up,0);ms(left,0);ms(right,0);
        for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&map[i][j]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(!map[i][j]){up[i][j]=up[i-1][j]+1;left[i][j]=left[i][j-1]+1;}
        for(int i=n;i>=1;i--)
            for(int j=m;j>=1;j--)
                if(!map[i][j]){right[i][j]=right[i][j+1]+1;}
        
        ms(dp,0);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(map[i][j]){
                    dp[i][j]=min(dp[i-1][j-1],min(left[i][j-1],up[i-1][j]))+1;
                    ans=max(dp[i][j],ans);
                }
        ms(dp,0);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(map[i][j]){
                    dp[i][j]=min(dp[i-1][j+1],min(up[i-1][j],right[i][j+1]))+1;
                    ans=max(dp[i][j],ans);
                }
        printf("%d\n",ans);
    }
    
    return 0;
}