#include <stdio.h>
#include <stdlib.h>
int map[1001][1001] = {0};
int queue[10000000][2] = {0};
int rear = 0, front = 0;
int x, y, day=0;
void enq(int a, int b)
{
queue[rear][0]=a;
queue[rear][1]=b;
map[a][b]=1;
rear++;
}
void diffuse() {
int max = rear-1;
for(int i = front; i <= max; i++) {
int a = queue[i][0];
int b = queue[i][1];
if(a-1 >= 0 &&map[a-1][b] == 0 ) enq(a-1,b);
if(a+1 < x && map[a+1][b] == 0 ) enq(a+1,b);
if(b-1 >= 0 &&map[a][b-1] == 0 ) enq(a,b-1);
if(b+1 < y && map[a][b+1] == 0 ) enq(a,b+1);
front++;
}
}
int main()
{
scanf("%d %d", &y, &x);
for(int i = 0; i < x; i++) {
for(int j = 0; j < y; j++) {
scanf("%d", &map[i][j]);
if(map[i][j] == 1) enq(i,j);
}
}
while(rear!=front) {
day++;
diffuse();
}
for(int i = 0; i < x; i++) {
for(int j = 0; j < y; j++) {
if(map[i][j] == 0) {
printf("-1");
return 0;
}
}
}
printf("%d", day-1);
return 0;
}
/////////////////////////
#include <stdio.h>
#include <stdlib.h>
int map[1001][1001] = {0};
int queue[10000001][2] = {0};
int r = 0, f = 0;
//front : output data index
//rear : input data index
int x, y, day=0;
void enq(int a, int b)
{
if(a<0||b<0||a>=x||b>=y) return ;
queue[++r][0]=a;
queue[r][1]=b;
map[a][b]=1;
}
int main()
{
scanf("%d %d", &y, &x);
int i, j,max,a,b;
for(i = 0; i < x; i++)
for(j = 0; j < y; j++)
{
scanf("%d", &map[i][j]);
if(map[i][j] == 1) enq(i,j);
}
while(f!=r)
{
day++;
max=r;
for(i = f+1; i <= max; i++)
{
f++;
a = queue[i][0];
b = queue[i][1]; //deque();
if(map[a-1][b] == 0 )
enq(a-1,b);
if(map[a+1][b] == 0 )
enq(a+1,b);
if(map[a][b-1] == 0 )
enq(a,b-1);
if(map[a][b+1] == 0 )
enq(a,b+1);
}
}
for(i = 0; i < x; i++)
for(j = 0; j < y; j++)
if(map[i][j] == 0)
{
printf("-1");
return 0;
}
printf("%d", day-1);
return 0;
}



