Problem: You are given a grid of squares with H horizontal rows and W vertical columns, where each square is painted white or black. HW characters from A_{11} to A_{HW} represent the colors of the squares. A_{ij} is `#` if the square at the i-th row from the top and the j-th column from the left is black, and A_{ij} is `.` if that square is white.

We will repeatedly perform the following operation until all the squares are black:

* Every white square that shares a side with a black square, becomes black.



Find the number of operations that will be performed. The initial grid has at least one black square.

Constraints

* 1 \leq H,W \leq 1000
* A_{ij} is `#` or `.`.
* The given grid has at least one black square.

Input

Input is given from Standard Input in the following format:


H W
A_{11}A_{12}...A_{1W}
:
A_{H1}A_{H2}...A_{HW}


Output

Print the number of operations that will be performed.

Examples

Input

3 3
...
.#.
...


Output

2


Input

6 6
..#..#
......
..#..
......
.#....
....#.


Output

3

Solution (in JAVA):

Solution:
import static java.lang.System.*;
import java.util.*;

class Cost {
	int x, y, c;
	
	Cost(int _x, int _y, int _c) {
		x = _x;
		y = _y;
		c = _c;
	}
}

public class Main {
	static int[] dx = {-1, 0, 1, 0};
	static int[] dy = {0, -1, 0, 1};
	
    public static void main(String[] args) {
        Scanner sc = new Scanner(in);

        int h = sc.nextInt();
		int w = sc.nextInt();
		char[][] map = new char[h][w];
		LinkedList<Cost> open = new LinkedList<Cost>();
		
		for(int i=0; i<h; i++) {
			map[i] = sc.next().toCharArray();
			
			for(int j=0; j<w; j++) {
				if(map[i][j] == '#') open.add(new Cost(j, i, 0));
			}
        }
		
		int ans = 0;
		while(!open.isEmpty()) {
			Cost now = open.poll();
			ans = Math.max(ans, now.c);
			
			for(int i=0; i<4; i++) {
				int nx = now.x + dx[i];
				int ny = now.y + dy[i];
				int nc = now.c + 1;
				
				if(nx < 0 || w <= nx || ny < 0 || h <= ny) continue;
				if(map[ny][nx] == '#') continue;
				
				map[ny][nx] = '#';
				open.add(new Cost(nx, ny, nc));
			}
		}
		
        out.println(ans);
    }
}