#88d 幅優先探索
#https://ja.wikipedia.org/wiki/%E5%B9%85%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2

from collections import deque

H,W = map(int, input().split())

all_white = 0

###入力の読み込みと配列の初期化
#最初の行
c_array = [[0 for _ in range(W+1)]]  #入力値。周りには番兵を置いて(1,1)始まりにする。以下も同様。
visited_flag_array = [[1 for _ in range(W+1)]] #訪問済みフラグ 0は未発見、1はキューへ追加or訪問済みor訪問不可
distance_array = [[-1 for _ in range(W+1)]] #開始地点からの距離。∴開始地点は0  訪問不可能地点は-1
#中間行
for i in range(H):
    c = str(input())
    c_list = [0] + [c[i] for i in range(W)] + [0]   
    c_array.append(c_list)
    
    all_white += c_list.count(".")
    
    visited_list = [1] + [0 for _ in range(W)] + [1]
    visited_flag_array.append(visited_list)

    distance_list = [-1] + [-1 for _ in range(W)] + [-1]
    distance_array.append(distance_list)
#最終行
c_array.append([0 for _ in range(W+1)])
visited_flag_array.append([1 for _ in range(W+1)])
distance_array.append([-1 for _ in range(W+1)])

#幅優先探索のロジック
def bfs(start_node_y,start_node_x):
    candidate_deque = deque() #(y座標,x座標,開始時点からの距離) のキュー
    
    #開始地点をキューに追加・処理
    visited_flag_array[start_node_y][start_node_x] = 1     #訪問フラグを立てる
    candidate_deque.append((start_node_y,start_node_x,0))  #キューへの追加
    distance_array[start_node_y][start_node_x] = 0         #距離の記録
    
    for _ in range(1,H*W*4):
        #print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
        if len(candidate_deque) == 0:
            break
        else:
            visiting_node = candidate_deque.popleft()
            vn_y = visiting_node[0]
            vn_x = visiting_node[1]
            vn_d = visiting_node[2]
            
            #nodeの処理
            #print("現在地点(y,x):(",vn_y,",",vn_x,")=",c_array[vn_y][vn_x])
            #print("距離:", distance_array[vn_y][vn_x],"  訪問フラグ:",visited_flag_array[vn_y][vn_x])
            
            #現在のnodeに接しているnodeを列挙
            connecting_node_list = [(vn_y+1,vn_x),(vn_y,vn_x+1),(vn_y-1,vn_x),(vn_y,vn_x-1)]
            #列挙したnodeをすべて処理
            for connecting_node in connecting_node_list:
                cn_y = connecting_node[0]
                cn_x = connecting_node[1]
                
                #print("接続点(y,x)=(",cn_y,",",cn_x,") =",c_array[vn_y][vn_x])
                #print("訪問フラグ:",visited_flag_array[cn_y][cn_x],end="")
                
                if visited_flag_array[cn_y][cn_x] != 1 and c_array[cn_y][cn_x] == ".":
                    #print("…未訪問 ,",end="")
                    
                    visited_flag_array[cn_y][cn_x] = 1
                    candidate_deque.append((cn_y,cn_x,vn_d + 1))
                    distance_array[cn_y][cn_x] = vn_d + 1
                    
                    #print(candidate_deque)
                    
                    #!!!!!!!!!!!!!!!!!!!最短距離を求める場合はここで抜ける!!!!!!!!!!!!!!!!!!!!
                    if cn_y == H and cn_x == W:
                        break
                #else:
                #    if visited_flag_array[cn_y][cn_x] == 1 and c_array[cn_y][cn_x] == ".":
                #        print("…訪問済み")
                #    elif c_array[cn_y][cn_x] == "#":
                #        print("…訪問不可(#)")
                #        if visited_flag_array[cn_y][cn_x] == 0:
                #            visited_flag_array[cn_y][cn_x] = 1
                #    elif c_array[cn_y][cn_x] == 0:
                #        print("…訪問不可(範囲外)")

#main
bfs(1,1)
shortest_distance = distance_array[H][W] + 1 #原点もカウントに追加したいので+1

#問題の回答形式に合わせる
if shortest_distance == 0: #訪問不可能地点は-1で初期化しており、上で+1しているので。
    print(-1)
else:
    print(all_white - shortest_distance) #最短経路以外は全部塗れる

Measured memory_bytes: 3444