object Main extends App {
  val line = readLine.split(" ").map(_.toInt)
  val H = line(0)
  val W = line(1)
  val board = Array.ofDim[Int](H*W)
  for(j <- 0 until H) {
    val l = readLine.toList
    for((b, i) <- l.zipWithIndex) {
      board(j*W+i) = if(b == '.') Int.MaxValue else -1
    }
  }
  val count = board.count(_ == Int.MaxValue)
  board(0) = 0
  val last = H*W - 1

  def nextStep(board: Array[Int], pos:(Int, Int)=(0,0), value:Int=0):Unit = {
    val direction = List((0,1), (0,-1), (1, 0), (-1,0))
    val myValue = board(pos._2*W+pos._1)
    var maximum = -1
    for(d <- direction) {
      val nextX = pos._1 + d._1
      val nextY = pos._2 + d._2
      (nextX, nextY) match {
        case (x:Int, y:Int) if x == -1 || y == -1 || x == W || y == H => ()
        case (x:Int, y:Int) if y*W+x == last =>
          if(board(last) > myValue) {
            board(y*W+x) = myValue+1
          }
        case (x:Int, y:Int) =>
          if(board(y*W+x) > myValue) {
            board(y*W+x) = myValue+1
            nextStep(board, (x, y), myValue+1)
          }
      }
    }
  }
  nextStep(board)
  if(board(last) == Int.MaxValue) {
    println(-1)
  } else {
    println(count-(board(last)+1))
  }
}
