#include <bits/stdc++.h>
using namespace std;
const int MAXN = 55;
const int dx[4] = {0, 0, 1, -1};
const int dy[4] = {1, -1, 0, 0};
char mp[MAXN][MAXN];
bool se[MAXN][MAXN];
int n, m, dis[MAXN][MAXN];
queue<pair<int, int> > Q;
bool isval(int x, int y) {
  return x >= 0 && y >= 0 && x < n && y < m && mp[x][y] == '.';
}
void BFS(pair<int, int> a) {
  for (int k = 0; k < 4; k++) {
    int x = a.first + dx[k], y = a.second + dy[k];
    if (isval(x, y) && !se[x][y]) {
      se[x][y] = 1;
      Q.push({x, y});
      dis[x][y] = dis[a.first][a.second] + 1;
    }
  }
}
int main() {
  cin >> n >> m;
  int cnt = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) cin >> mp[i][j], cnt += mp[i][j] == '#';
  dis[n - 1][m - 1] = -1;
  Q.push({0, 0});
  se[0][0] = 1;
  dis[0][0] = 1;
  while (!Q.empty()) BFS(Q.front()), Q.pop();
  if (dis[n - 1][m - 1] == -1) return cout << -1, 0;
  cout << n * m - cnt - dis[n - 1][m - 1];
}
