import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static class GridPair {
int r;
int c;
public GridPair(int r, int c) {
this.r = r;
this.c = c;
}
}
private static boolean isBoundary(int X, int Y, int[][] grid) {
int openSpaces = 0;
if(X + 1 <= grid.length - 1 && grid[X+1][Y] == 0) {
openSpaces++;
}
if(X - 1 >= 0 && grid[X-1][Y] == 0) {
openSpaces++;
}
if(Y + 1 <= grid[0].length - 1 && grid[X][Y+1] == 0) {
openSpaces++;
}
if(Y - 1 >= 0 && grid[X][Y-1] == 0) {
openSpaces++;
}
return openSpaces > 0;
}
private static void bfsForKnowingIsland(Queue<GridPair> q, Queue<GridPair> bfsq, int[][] grid, boolean[][] visited) {
while (!bfsq.isEmpty()) {
GridPair currPair = bfsq.poll();
int X = currPair.r;
int Y = currPair.c;
if(isBoundary(X, Y, grid)) {
q.offer(new GridPair(X, Y));
}
int[] dirs = {-1, 0, 1, 0, -1};
for(int i = 0; i < 4; i++) {
int newX = X + dirs[i];
int newY = Y + dirs[i + 1];
if(newX <= grid.length - 1 && newX >= 0 && newY <= grid[0].length - 1 && newY >= 0 && !visited[newX][newY]) {
if(grid[newX][newY] == 1) {
visited[newX][newY] = true;
bfsq.offer(new GridPair(newX, newY));
}
}
}
}
}
public static void main
(String[] args
) {
Scanner scanner
= new Scanner
(System.
in);
int rows = scanner.nextInt();
int cols = scanner.nextInt();
int[][] grid = new int[rows][cols];
for(int i = 0; i < rows; i++) {
for(int j = 0; j < cols; j++) {
grid[i][j] = scanner.nextInt();
}
}
boolean[][] visited = new boolean[rows][cols];
Queue<GridPair> q = new LinkedList<>();
Queue<GridPair> bfsq = new LinkedList<>();
for(int i = 0; i < rows; i++) {
boolean broke = false;
for(int j = 0; j < cols; j++) {
if(grid[i][j] == 1) {
visited[i][j] = true;
bfsq.offer(new GridPair(i, j));
bfsForKnowingIsland(q, bfsq, grid, visited);
broke = true;
break;
}
}
if(broke) {
break;
}
}
int ans = 0;
while (!q.isEmpty()) {
int currSize = q.size();
for(int i = 0; i < currSize; i++) {
GridPair currPair = q.poll();
int currX = currPair.r;
int currY = currPair.c;
int[] dirs = {-1, 0, 1, 0, -1};
for(int j = 0; j < 4; j++) {
int newX = currX + dirs[j];
int newY = currY + dirs[j + 1];
if(newX <= grid.length - 1 && newX >= 0 && newY <= grid[0].length - 1 && newY >= 0 && !visited[newX][newY]) {
if(grid[newX][newY] == 1) {
return;
}
else {
visited[newX][newY] = true;
q.offer(new GridPair(newX, newY));
}
}
}
}
ans++;
}
}
}