/*
#include <stdio.h>
int mat[9][9] = { 0 };
int num = 1;
int region = 0;
void bomb(int x, int y)
{
if(mat[x][y]==6) return;
int color = mat[x][y];
mat[x][y] = 6;
if (mat[x - 1][y] == color)
{
num++;
bomb(x - 1, y);
}
if (mat[x + 1][y] == color)
{
num++;
bomb(x + 1, y);
}
if (mat[x][y - 1] == color)
{
num++;
bomb(x, y - 1);
}
if (mat[x][y + 1] == color)
{
num++;
bomb(x, y + 1);
}
}
int main()
{
for (int i = 1; i <= 7; i++)
{
for (int j = 1; j <= 7; j++)
{
scanf("%d", &mat[i][j]);
}
}
for (int i = 1; i <= 7; i++)
{
for (int j = 1; j <= 7; j++)
{
num = 1;
bomb(i, j);
if (num >= 3)
{
region++;
}
}
}
printf("%d", region);
}
*/
/*
#include <stdio.h>
int map[102][102] = {0};
int region = 0;
void dfs(int x, int y)
{
if (map[x][y]==9) return;
map[x][y] = 9;
region++;
if (map[x-1][y] == 0)
{
dfs(x-1, y);
}
if (map[x+1][y] == 0)
{
dfs(x+1, y);
}
if (map[x][y-1] == 0)
{
dfs(x, y-1);
}
if (map[x][y+1] == 0)
{
dfs(x, y+1);
}
}
int main()
{
int m, n, k;
int a, b, c, d;
int count=0, count2[5000]={0};
scanf("%d %d %d", &m, &n, &k);
for (int i=0; i<=m+1; i++)
{
for (int j=0; j<=n+1; j++)
{
if(i==0 ||j==0 ||i==m+1||j==n+1) {
map[i][j] = 9;
}
}
}
for (int i=0; i<k; i++)
{
scanf("%d %d %d %d", &a, &b, &c, &d);
for(int x=b; x<d; x++) {
for(int y =a; y<c; y++) {
map[x+1][y+1] = 1;
}
}
}
for (int i=1; i<=m; i++)
{
for (int j=1; j<=n; j++)
{
region = 0;
if (map[i][j] == 0)
{
count++;
dfs(i, j);
count2[count] = region;
}
}
}
for (int i = 1; i <= count; i++)
{
for (int j = 1; j <= count-1; j++)
{
if (count2[j] > count2[j + 1])
{
int temp = count2[j];
count2[j] = count2[j + 1];
count2[j + 1] = temp;
}
}
}
printf("%d\n", count);
for (int i=1; i<=count; i++)
{
printf("%d ", count2[i]);
}
}
*/
#include <stdio.h>
int box[1002][1002] = {0};
int k=0;
int queue[1000000][2] = {0};
int front=0, rear=0, front2=0;
void calcu(int x, int y)
{
//printf("%d %d %d\n", front, front2, rear);
if (box[x][y] == -1) return;
if (box[x-1][y] == 0)
{
queue[front][0] = x-1;
queue[front][1] = y;
front++;
box[x-1][y] = k;
}
if (box[x+1][y] == 0)
{
queue[front][0] = x+1;
queue[front][1] = y;
front++;
box[x+1][y] = k;
}
if (box[x][y-1] == 0)
{
queue[front][0] = x;
queue[front][1] = y-1;
front++;
box[x][y-1] = k;
}
if (box[x][y+1] == 0)
{
queue[front][0] = x;
queue[front][1] = y+1;
front++;
box[x][y+1] = k;
}
}
void bfs()
{
while (front!=rear)
{
//printf("%d %d\n", front, rear);
k++;
front2 = front;
for (; rear<=front2; rear++)
{
int x=queue[rear][0];
int y=queue[rear][1];
calcu(x, y);
}
}
}
int main()
{
int m, n, x, y;
scanf("%d %d", &m, &n);
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++)
{
scanf("%d", &box[i][j]);
}
}
for (int i=0; i<=n+1; i++)
{
for (int j=0; j<=m+1; j++)
{
if(i==0 || j==0 || i==n+1|| j==m+1) {
box[i][j] = -1;
}
}
}
front = 0;
rear = 0;
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++)
{
if (box[i][j] == 1)
{
queue[front][0]=i;
queue[front][1]=j;
front++;
if (front==m*n)
{
printf("0");
break;
}
}
}
}
bfs();
// for (int i=1; i<=n; i++)
// {
// for (int j=1; j<=m; j++)
// {
// printf("%d ", box[i][j]);
// }
// printf("\n");
// }
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++)
{
if (box[i][j]==0)
{
printf("-1");
return;
}
}
}
printf("%d", k-1);
}



