#include <bits/stdc++.h>

#define F first
#define S second
#define MP make_pair
#define pb push_back
#define all(a) a.begin(), a.end()
#define lcm( a, b ) (a)/__gcd((a),(b))*(b)
#define endl '\n'

using namespace std;

typedef long long LL;
typedef pair< int, int > P;
typedef pair< LL, LL > LP;

static const int INF = INT_MAX;
static const LL LINF = LLONG_MAX;
static const int MIN = INT_MIN;
static const LL LMIN = LLONG_MIN;
static const int MOD = 1000000007;
static const int SIZE = 200005;

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

LL fac[SIZE], finv[SIZE], inv[SIZE];
void combInit() {
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for( int i = 2; i < SIZE; ++i ) {
        fac[i] = (fac[i - 1] * i) % MOD;
        inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;
        finv[i] = (finv[i - 1] * inv[i]) % MOD;

    }
}

LL comb(int n, int k) {
    if( n < k ) return 0;
    if( n < 0 || k < 0 ) return 0;
    return (fac[n] * (finv[k] * finv[n - k] % MOD)) % MOD;

}

vector< int > Div( int n ) {
    vector< int > ret;
    for( int i = 1; i * i <= n; ++i ) {
        if( n % i == 0 ) {
            ret.pb( i );

            if( i * i != n ) ret.pb( n / i );
        }
    }
    sort( all( ret ) );
    return ret;
}

void bfs(void);

int mp[55][55];
int dist[55][55];
bool visit[55][55];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int h, w;
    cin >> h >> w;
    for( int i = 0; i <= h + 1; ++i ) {
        for( int j = 0; j <= w + 1; ++j ) {
            mp[i][j] = -1;

        }
    }

    for( int i = 1; i <= h; ++i ) {
        for( int j = 1; j <= w; ++j ) {
            char c;
            cin >> c;
            if( c == '.' ) {
                mp[i][j] = 0;
                dist[i][j] = INF;

            }
        }
    }

    bfs();
    set< int > st;
    int res = 0;
    int mcost = dist[h][w];
    if( mcost == INF ) {
        cout << -1 << endl;
        return 0;

    }

    for( int i = 1; i <= h; ++i ) {
        for( int j = 1; j <= w; ++j ) {
            if( mp[i][j] < 0 ) {
                continue;

            }
            if( dist[i][j] > mcost ) {
                ++res;
                continue;

            }
            int sz = st.size();
            st.insert(dist[i][j]);
            if( sz == st.size() ) {
                ++res;

            }
        }
    }
    /*
    for( int i = 1; i <= h; ++i ) {
        for( int j = 1; j <= w; ++j ) {
            cout << dist[i][j] << " ";

        }
        cout << endl;
    }
    */
    cout << res << endl;

    return 0;
}

void bfs(void) {
    queue< pair<P, int> > q;
    q.push(MP(MP(1, 1), 0));
    dist[1][1] = 0;

    while( !q.empty() ) {
        pair<P, int> p = q.front();
        q.pop();
        int x, y, ncost;
        x = p.F.S;
        y = p.F.F;
        ncost = p.S;
        visit[y][x] = true;

        for( int i = 0; i < 4; ++i ) {
            int my, mx;
            my = y + dy[i];
            mx = x + dx[i];
            if( mp[my][mx] == -1 || visit[my][mx] ) {
                continue;

            }
            dist[my][mx] = ncost + 1;
            visit[my][mx] = true;
            q.push(MP(MP(my, mx), dist[my][mx]));

        }
    }

    return;
}



Measured memory_bytes: 256