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
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0; i<(n); i++)
typedef struct Maze{
  int y;
  int x;
  int t;
} MAZE;
int dy[]={0,0,1,-1};
int dx[]={1,-1,0,0};
int main() {
  int h,w; cin >> h >> w;
  vector<vector<char>> grid(h, vector<char>(w));
  vector<vector<int>> turn(h, vector<int>(w,-1));
  rep(i,h)rep(j,w) cin >> grid[i][j];
  queue<MAZE> q;
  rep(i,h)rep(j,w){
    if(grid[i][j]=='#'){
      q.push(MAZE{i,j,0});
    }
  }
  while(!q.empty()){
    int sy=q.front().y;
    int sx=q.front().x;
    int time=q.front().t;
    q.pop();
    if(turn[sy][sx]!=-1) continue;
    turn[sy][sx]=time;
    rep(dir,4){
      int ny=sy+dy[dir],nx=sx+dx[dir];
      if(ny>=h||ny<0||nx>=w||nx<0) continue;
      q.push(MAZE{ny,nx,time+1});
    }
  }
  int ans=-1;
  rep(i,h)rep(j,w) ans=max(ans,turn[i][j]);
  cout << ans << endl;
}