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

  def now(board: Array[Array[Int]]):(Int, Int) = {
    val i = board.indexWhere(line => line.exists(_ == 3))
    val j = board(i).indexWhere(_ == 3)
    return (i, j)
  }

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

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