
open Scanf
open Printf
open List

let step = [(1, 0); (0, 1); (-1, 0); (0, -1)]

let flip f x y = f y x

let inf = 101010101010

let read_int () = scanf " %d" (fun x -> x)

let rec read_ints n =
  if n = 0 then []
  else
    let a = scanf " %d" (fun x -> x) in
    a :: read_ints (n-1)

let () =
  let (h :: w :: _) = read_ints 2 in
  let num_white = ref 0 in
  let field = Array.init h (fun _ ->
    let row = scanf " %s" (fun s -> s) in
    flip String.iter row (
      fun c -> if c = '.' then num_white := !num_white + 1 else ()
    );
    row) in

  let min_dist = Array.init h (fun _ -> Array.init w (fun _ -> ref inf)) in
  min_dist.(0).(0) := 0;

  let queue = Queue.create () in
  Queue.push (0, 0) queue;
  while not (Queue.is_empty queue) do
    let x, y = Queue.pop queue in
    flip List.iter step (fun (dx, dy) ->
      let nx, ny = x + dx, y + dy in
      if nx < 0 || h <= nx || ny < 0 || w <= ny || String.get (field.(nx)) ny = '#'
      then ()
      else if !(min_dist.(nx).(ny)) = inf then (
        min_dist.(nx).(ny) := !(min_dist.(x).(y)) + 1;
        Queue.push (nx, ny) queue
      )
    )
  done;
  let ans = !(min_dist.(h-1).(w-1)) in
  printf "%d\n" (if ans = inf then -1 else !num_white - ans - 1)

