#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

struct Point{ll x,y;};

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

ll pro(vector<string> &lv, Point steva, queue<Point> redVatre){
    ll n=lv.size(), m=lv[0].size();
    queue<pair<Point,char>> red;
    vector<vector<ll>> vs(n, vector<ll>(m,INT_MAX)), vv(n, vector<ll>(m,INT_MAX));
    red.push({steva,'S'});
    vs[steva.x][steva.y]=0;
    while(!redVatre.empty()){
        Point v=redVatre.front();redVatre.pop();
        vv[v.x][v.y]=0;
        red.push({v,'X'});
    }
    ll rz=1;
    while(!red.empty()){
        pair<Point,char> front=red.front(); red.pop();
        Point tacka=front.first;
        char tip=front.second;
        ll x=tacka.x,y=tacka.y;
        if(tip=='S' && lv[x][y]=='.' && vs[x][y]<vv[x][y]) {
            rz++;
            lv[x][y]='S';
        }
        for(ll i=0;i<4;i++){
            ll nx=x+dx[i], ny=y+dy[i];
            if(!(nx>=0 && nx<n && ny>=0 && ny<m && lv[nx][ny]!='*'))continue;
            if(tip=='S' && vs[nx][ny]==INT_MAX && vv[nx][ny]>vs[x][y]+1){
                vs[nx][ny]=vs[x][y]+1;
                red.push({{nx,ny},'S'});
            } else if(tip=='X' && vv[nx][ny]==INT_MAX){
                vv[nx][ny]=vv[x][y]+1;
                red.push({{nx,ny},'X'});
            }
        }
    }
    for(ll i=0;i<n;i++)
        for(ll j=0;j<m;j++)
            if(lv[i][j]=='.') lv[i][j]='X';
    return rz;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    ll n,m;
    cin >> n >> m;
    vector<string> l(n);
    Point steva;
    queue<Point>redVatre;
    for(ll i=0;i<n;i++){
        cin>>l[i];
        for(ll j=0;j<m;j++){
            if(l[i][j]=='S')steva={i,j};
            else if(l[i][j]=='X')redVatre.push({i,j});
        }
    }

    cout << pro(l, steva, redVatre) << endl;
    return 0;
}