import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.InputMismatchException; import java.util.List; public class Main { static StringBuilder out = new StringBuilder(); static String ls = System.lineSeparator(); static final String OK = "Possible"; static final String NG = "Impossible"; static FastReader fr = new FastReader(); // static final int INF = Integer.MAX_VALUE - 300000000; public static void main(String[] args) throws Exception, IOException { char wall = '#'; char hole = '.'; int w = fr.nextInt(); int h = fr.nextInt(); char[][] space = new char[h][w]; for (int i = 0; i < h; i++) { space[i] = fr.next().toCharArray(); } List all = new ArrayList<>(); List one = new ArrayList<>(); for (int i = 0; i < h; i++) for (int j = 0; j < w; j++) if (space[i][j] == hole) { int[] a = { i, j }; all.add(a); } one.add(all.get(0)); int i = 0; for (;;) { int preSize = one.size(); all.removeAll(one); for (; i < preSize; i++) { int[] a = one.get(i); for (int[] b : all) { int range = Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]); if (range == 1 && !one.contains(b)) { one.add(b); } } } if(preSize == one.size()) break; } all.removeAll(one); List two = all; int min = Integer.MAX_VALUE; for(int[] a : one){ for(int[] b : two){ int range = Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]); if(range < min) min = range; } } System.out.println(min - 1); } static void printExit(String msg) { System.out.println(msg); System.exit(0); } } class FastReader { private InputStream in = System.in; private byte[] buf = new byte[1024]; private int charNum; private int charLen; private StringBuilder sb = new StringBuilder(); public int read() { if (charLen == -1) throw new InputMismatchException(); if (charNum >= charLen) { charNum = 0; try { charLen = in.read(buf); } catch (IOException e) { throw new InputMismatchException(); } if (charLen <= 0) return -1; } return buf[charNum++]; } public String next() { int c = read(); while (isWhitespace(c)) { c = read(); } sb.setLength(0); do { sb.appendCodePoint(c); c = read(); } while (!isWhitespace(c)); return sb.toString(); } public char[] nextCharArray() { return next().toCharArray(); } public int nextInt() { return (int) nextLong(); } public int[] nextIntArray(int n) { int[] array = new int[n]; for (int i = 0; i < n; i++) array[i] = nextInt(); return array; } public List nextIntList(int n) { Integer[] array = new Integer[n]; for (int i = 0; i < n; i++) array[i] = nextInt(); return Arrays.asList(array); } public int[][] nextIntArray2D(int n, int m) { int[][] array = new int[n][m]; for (int i = 0; i < n; i++) array[i] = nextIntArray(m); return array; } public List nextIntsList(int n, int m) { List list = new ArrayList<>(n); for (int i = 0; i < n; i++) list.add(nextIntArray(m)); return list; } public long nextLong() { int c = read(); while (isWhitespace(c)) { c = read(); } int sgn = 1; if (c == '-') { sgn = -1; c = read(); } long res = 0; do { if (c < '0' || c > '9') throw new InputMismatchException(); res *= 10; res += c - '0'; c = read(); } while (!isWhitespace(c)); return res * sgn; } public double nextDouble() { return Double.parseDouble(next()); } public double[] nextDoubleArray(int n) { double[] array = new double[n]; for (int i = 0; i < n; i++) array[i] = nextDouble(); return array; } public boolean isWhitespace(int c) { return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1; } }