using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AGC033A8OLD
{
    class Program
    {
        static int black = 0;
        static int[] dp;
        static int max;
        static int ans = 0;
        public struct pos
        {
            public int x;
            public int y;
        }
        public static List<pos> C_list = new List<pos>();
        static void Main(string[] args)
        {
            string[] input = Console.ReadLine().Split(' ');
            int h = int.Parse(input[0]);
            int w = int.Parse(input[1]);
            dp = new int[h * w];
            max = h + w - 1;//答えの最大値+1　最大の答えは(h-1)+(w-1)

            for (int i = 0; i < h; i++)
            {
                var tmp = Console.ReadLine();
                for (int j = 0; j < w; j++)
                {
                    var tmp2 = tmp.Substring(j, 1);
                    if (tmp2 == "#")
                    {
                        dp[i * w + j] = black;
                        pos p = new pos();
                        p.x = i;
                        p.y = j;
                        C_list.Add(p);//黒コマの場所をリストにする
                    }
                    else
                    {
                        dp[i * w + j] = max;
                    }
                }
            }
            while (C_list.Count > 0)
            {
                List<pos> C2_list = new List<pos>(C_list);
                C_list.Clear();
                foreach (var item in C2_list)
                {
                    seek(item.x, item.y, h, w);//周囲をチェック
                }

                C2_list.Clear();
                /*
                for (int i = 0; i < h; i++)
                {
                    for (int j = 0; j < w; j++)
                    {
                        Console.Write(dp[i * h + j] + " ");
                    }
                    Console.WriteLine();
                }
                Console.WriteLine();
*/
            }
            Console.WriteLine(ans);
        }
        static void seek(int i, int j, int h, int w)
        {
            pos p = new pos();
            if (i > 0 && dp[(i - 1) * w + j] == max)
            {
                dp[(i - 1) * w + j] = dp[i * w + j] + 1;
                p.x = i - 1;
                p.y = j;
                ans = Math.Max(ans, dp[(i - 1) * w + j]);
                C_list.Add(p);
            }
            if (i < h - 1 && dp[(i + 1) * w + j] == max)
            {
                dp[(i + 1) * w + j] = dp[i * w + j] + 1;
                p.x = i + 1;
                p.y = j;
                ans = Math.Max(ans, dp[(i + 1) * w + j]);
                C_list.Add(p);
            }
            if (j > 0 && dp[i * w + j - 1] == max)
            {
                dp[i * w + j - 1] = dp[i * w + j] + 1;
                p.x = i;
                p.y = j - 1;
                ans = Math.Max(ans, dp[i * w + j - 1]);
                C_list.Add(p);
            }
            if (j < w - 1 && dp[i * w + j + 1] == max)
            {
                dp[i * w + j + 1] = dp[i * w + j] + 1;
                p.x = i;
                p.y = j + 1;
                ans = Math.Max(ans, dp[i * w + j + 1]);
                C_list.Add(p);
            }
        }
    }
}


Measured memory_bytes: 33224