
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int MAX = 1001;
const int dx[] = { 0,0,-1,1 };
const int dy[] = { -1,1,0,0 };
int n, m;
int cnt = 0;
int one = true;
int mat[MAX][MAX];
int visited[MAX][MAX];
queue<pair<int, int> > q;
int main() {
int i, j, x, y;
scanf("%d %d", &m, &n);
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
scanf("%d", &mat[i][j]);
visited[i][j] = -1;
if (mat[i][j] == 0) one = false;
else if (mat[i][j] == 1) {
q.push({i,j});
visited[i][j] = 0;
}
}
}
if (one) {
printf("0");
return 0;
}
else {
while(!q.empty()) {
x = q.front().first;
y = q.front().second;
q.pop();
for (i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < n && ny >= 0 && ny < m) {
if (mat[nx][ny] == 0 && visited[nx][ny] == -1) {
visited[nx][ny] = visited[x][y] + 1;
q.push({nx, ny});
}
}
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
cnt = max(cnt, visited[i][j]);
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
if(mat[i][j] == 0 && visited[i][j] == -1) {
printf("-1");
return 0;
}
}
}
printf("%d", cnt);
}
return 0;
}