import sys

def flagInit():
    global NODES
    for i in c:
        tmp=[]
        for j in i:
            if(j=='#'):
              tmp.append(-1)
            else:
              NODES+=1
              tmp.append(0)
        bf_flag.append(tmp)

def bf_search(sx,sy,gx,gy):
    queue=[[]]*NODES
    bf_flag[sx][sy] = 1
    head=0
    tail=0
    tmp=1
    queue[head]=[sx,sy]
    head+=1
    

    while (head > tail):
        u=queue[tail]
        tail+=1
        tmp=1
        x=u[0]
        y=u[1]
        if(x==gx and y==gy):
            return (bf_flag[gx][gy]-1)
        
        if(c[x+1][y] == '.' and bf_flag[x+1][y]==0):  # 隣接しているノードでまだ探索していない場合
                queue[head]=[x+1,y]
                head+=1
                bf_flag[x+1][y]=bf_flag[x][y]+1
                tmp+=1
        if(c[x-1][y] == '.' and bf_flag[x-1][y]==0):  # 隣接しているノードでまだ探索していない場合
                queue[head]=[x-1,y]
                head+=1
                bf_flag[x-1][y]=bf_flag[x][y]+1 
                tmp+=1
        if(c[x][y+1] == '.' and bf_flag[x][y+1]==0):  # 隣接しているノードでまだ探索していない場合
                queue[head]=[x,y+1]
                head+=1
                tmp+=1
                bf_flag[x][y+1]=bf_flag[x][y]+1
        if(c[x][y-1] == '.' and bf_flag[x][y-1]==0):  # 隣接しているノードでまだ探索していない場合
                queue[head]=[x,y-1]
                head+=1
                tmp+=1
                bf_flag[x][y-1]=bf_flag[x][y]+1



NODES = 0  # ノードの数
START = 0  # 探索開始ノード
bf_flag=[]
maxValue=0
c=[]

H,W=map(int,input().split())
c.append(['#' for _ in range(W+2)])
for _ in range(H):
    li = list(input())
    li.append('#')
    li.insert(0,'#')
    c.append(li)
c.append(['#' for _ in range(W+2)])
nod=[[1,1,H,W],[H,1,1,W]]
for _ in range(2):
    bf_flag=[]
    NODES=0
    flagInit()
    n=nod.pop()
    sx,sy,gx,gy=n[0],n[1],n[2],n[3]
    tmp=bf_search(sx,sy,gx,gy)
    if(maxValue<tmp):
        maxValue=tmp
print(maxValue)



