#include<iostream>
#include<queue>
using namespace std;

int main() {
  int H, W; cin >> H >> W;
  int N = H*W;
  int A[N]; string str;
  int white_num = 0;
  for (int i = 0; i < H; i++) {
    cin >> str;
    for (int j = 0; j < W; j++) {
      white_num += A[i*W+j] = (str[j] == '.');
    }
  }
  queue<pair<int, int>> Q; Q.push(make_pair(0, 1));
  bool visited[N]; for (int i = 0; i < N; i++) visited[i] = false;
  visited[0] = true;
  int score = -1;
  while (!Q.empty()) {
    auto front = Q.front(); Q.pop();
    int u = front.first, d = front.second;
    if (u == H*W-1) { score = white_num-d; break; }
    vector<int> e;
    if (u >= W) e.push_back(u-W);
    if (u % W > 0) e.push_back(u-1);
    if (u % W < W-1) e.push_back(u+1);
    if (u / W < H-1) e.push_back(u+W);
    for (int v : e) {
      if (A[v] && !visited[v]) {
        visited[v] = true;
        Q.push(make_pair(v, d+1));
      }
    }
  }
  cout << score << endl;
}
#include <bits/stdc++.h>
#define rep(i,n) for (int i = 0; i < (n); ++i)
using namespace std;
using ll = long long;
using P = pair<int,int>;

const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};

int main() {
    int H, W;
    cin >> H >> W;

    vector<string> Graph(H);
    rep(i,H) cin >> Graph.at(i);

    vector<vector<int>> dist(H, vector<int>(W, -1)); // -1: 未訪問
    dist[0][0] = 0;

    int ans = -1;
    int wall = 0;
    rep(i,H) rep(j,W) if (Graph.at(i).at(j) == '#') ++wall;


    vector<string> G = Graph;
    vector<vector<int>> reached = dist;
    queue<P> que;

    que.push(make_pair(0, 0));
    dist[0][0] = 0;

    while (!que.empty()) {
        P p = que.front();
        que.pop();
        for (int direction = 0; direction < 4; ++direction) {
            int nh = p.first + dx[direction];
            int nw = p.second + dy[direction];
            if (nh < 0 || nh >= H || nw < 0 || nw >= W) continue;
            if (dist.at(nh).at(nw) > -1) continue;
            if (Graph.at(nh).at(nw) == '#') continue;
            dist.at(nh).at(nw) = dist.at(p.first).at(p.second) + 1;
            if (nh == H - 1 && nw == W - 1) {
                ans = dist.at(nh).at(nw);
                break;
            }
            que.push(make_pair(nh, nw));
        }
    }
    if (ans == -1) cout << ans << endl;
    else 
    cout << H * W - wall - (ans + 1) << endl;
}
