import sys



h,w = [int(i) for i in input().split()]



sys.setrecursionlimit(100000)



s = [['#']*(w+2)] + [['#']+list(eval(input()))+['#'] for _ in range(h)] + [['#']*(w+2)]

#print(s)



cost = [[-1 if s[y][x] == '#' else float('inf') for x in range(w+2)] for y in range(h+2)]

cost[1][1] = 0

#print(cost)



def list_flatten(nested_list):

  flat_list = []

  fringe = [nested_list]

  

  while len(fringe) > 0:

    node = fringe.pop(0)

    if isinstance(node, list):

      fringe = node + fringe

    else:

      flat_list.append(node)



  return(flat_list)

      

def move(y,x):

  if cost[y+1][x] != -1:

    if cost[y+1][x] > cost[y][x]+1:

      cost[y+1][x] = cost[y][x]+1

      move(y+1,x)

      

  if cost[y-1][x] != -1:

    if cost[y-1][x] > cost[y][x]+1:

      cost[y-1][x] = cost[y][x]+1

      move(y-1,x)

  

  if cost[y][x+1] != -1:

    if cost[y][x+1] > cost[y][x]+1:

      cost[y][x+1] = cost[y][x]+1

      move(y,x+1)

  

  if cost[y][x-1] != -1:

    if cost[y][x-1] > cost[y][x]+1:

      cost[y][x-1] = cost[y][x]+1

      move(y,x-1)

  



move(1,1)



#print(cost)



if cost[h][w] == float('inf'):

  print((-1))

else:

  while_num = list_flatten(s).count('.')

  print((while_num - (cost[h][w]+1)))

import sys



h,w = [int(i) for i in input().split()]



sys.setrecursionlimit(100000)



s = [['#']*(w+2)] + [['#']+list(eval(input()))+['#'] for _ in range(h)] + [['#']*(w+2)]

#print(s)



cost = [[-1 if s[y][x] == '#' else float('inf') for x in range(w+2)] for y in range(h+2)]

cost[1][1] = 0

#print(cost)



move_que = [[1,1]]



def list_flatten(nested_list):

  flat_list = []

  fringe = [nested_list]

  

  while len(fringe) > 0:

    node = fringe.pop(0)

    if isinstance(node, list):

      fringe = node + fringe

    else:

      flat_list.append(node)



  return(flat_list)

      

def move(place):

  y,x = place

  if cost[y+1][x] != -1:

    if cost[y+1][x] > cost[y][x]+1:

      cost[y+1][x] = cost[y][x]+1

      move_que.append([y+1,x])       

      

  if cost[y-1][x] != -1:

    if cost[y-1][x] > cost[y][x]+1:

      cost[y-1][x] = cost[y][x]+1

      move_que.append([y-1,x])

  

  if cost[y][x+1] != -1:

    if cost[y][x+1] > cost[y][x]+1:

      cost[y][x+1] = cost[y][x]+1

      move_que.append([y,x+1])

  

  if cost[y][x-1] != -1:

    if cost[y][x-1] > cost[y][x]+1:

      cost[y][x-1] = cost[y][x]+1

      move_que.append([y,x-1])

  

while len(move_que) != 0:

  move(move_que[0])

  move_que = move_que[1:]



#print(cost)



if cost[h][w] == float('inf'):

  print((-1))

else:

  while_num = list_flatten(s).count('.')

  print((while_num - (cost[h][w]+1)))

import sys

h, w = [int(i) for i in input().split()]
sys.setrecursionlimit(100000)
s = (
    [["#"] * (w + 2)]
    + [["#"] + list(eval(input())) + ["#"] for _ in range(h)]
    + [["#"] * (w + 2)]
)
# print(s)
cost = [
    [-1 if s[y][x] == "#" else float("inf") for x in range(w + 2)] for y in range(h + 2)
]
cost[1][1] = 0
# print(cost)
def list_flatten(nested_list):
    flat_list = []
    fringe = [nested_list]
    while len(fringe) > 0:
        node = fringe.pop(0)
        if isinstance(node, list):
            fringe = node + fringe
        else:
            flat_list.append(node)
    return flat_list


def move(y, x):
    if cost[y + 1][x] != -1:
        if cost[y + 1][x] > cost[y][x] + 1:
            cost[y + 1][x] = cost[y][x] + 1
            move(y + 1, x)
    if cost[y - 1][x] != -1:
        if cost[y - 1][x] > cost[y][x] + 1:
            cost[y - 1][x] = cost[y][x] + 1
            move(y - 1, x)
    if cost[y][x + 1] != -1:
        if cost[y][x + 1] > cost[y][x] + 1:
            cost[y][x + 1] = cost[y][x] + 1
            move(y, x + 1)
    if cost[y][x - 1] != -1:
        if cost[y][x - 1] > cost[y][x] + 1:
            cost[y][x - 1] = cost[y][x] + 1
            move(y, x - 1)


move(1, 1)
# print(cost)
if cost[h][w] == float("inf"):
    print((-1))
else:
    while_num = list_flatten(s).count(".")
    print((while_num - (cost[h][w] + 1)))

import sys

h, w = [int(i) for i in input().split()]
sys.setrecursionlimit(100000)
s = (
    [["#"] * (w + 2)]
    + [["#"] + list(eval(input())) + ["#"] for _ in range(h)]
    + [["#"] * (w + 2)]
)
# print(s)
cost = [
    [-1 if s[y][x] == "#" else float("inf") for x in range(w + 2)] for y in range(h + 2)
]
cost[1][1] = 0
# print(cost)
move_que = [[1, 1]]


def list_flatten(nested_list):
    flat_list = []
    fringe = [nested_list]
    while len(fringe) > 0:
        node = fringe.pop(0)
        if isinstance(node, list):
            fringe = node + fringe
        else:
            flat_list.append(node)
    return flat_list


def move(place):
    y, x = place
    if cost[y + 1][x] != -1:
        if cost[y + 1][x] > cost[y][x] + 1:
            cost[y + 1][x] = cost[y][x] + 1
            move_que.append([y + 1, x])
    if cost[y - 1][x] != -1:
        if cost[y - 1][x] > cost[y][x] + 1:
            cost[y - 1][x] = cost[y][x] + 1
            move_que.append([y - 1, x])
    if cost[y][x + 1] != -1:
        if cost[y][x + 1] > cost[y][x] + 1:
            cost[y][x + 1] = cost[y][x] + 1
            move_que.append([y, x + 1])
    if cost[y][x - 1] != -1:
        if cost[y][x - 1] > cost[y][x] + 1:
            cost[y][x - 1] = cost[y][x] + 1
            move_que.append([y, x - 1])


while len(move_que) != 0:
    move(move_que[0])
    move_que = move_que[1:]
# print(cost)
if cost[h][w] == float("inf"):
    print((-1))
else:
    while_num = list_flatten(s).count(".")
    print((while_num - (cost[h][w] + 1)))

+move_que = [[1, 1]] + + -def move(y, x): +def move(place): +    y, x = place -            move(y + 1, x) +            move_que.append([y + 1, x]) -            move(y - 1, x) +            move_que.append([y - 1, x]) -            move(y, x + 1) +            move_que.append([y, x + 1]) -            move(y, x - 1) +            move_que.append([y, x - 1]) -move(1, 1) +while len(move_que) != 0: +    move(move_que[0]) +    move_que = move_que[1:]