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 == '.') 0 else 1
    }
  }
  board(0) = 2
  val last = H*W-1
  board(last) = 2

  def calculate(board:Array[Int]):Int = board.count(_ == 0)

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