#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a; i<b;i++)
const int x[]={-1,1,0,0};
const int y[]={0,0,-1,1};
struct polje {int r,k;};
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m;
    cin>>n>>m;
    vector<vector<char>>lavirint(n,vector<char>(m));
    vector<vector<int>>vatra(n,vector<int>(m,-1));
    vector<vector<int>>steva(n,vector<int>(m,-1));
    queue<polje> qvatra, qsteva;
    polje steva_start;
    rep(i,0,n){
        rep(j,0,m){
            cin>>lavirint[i][j];
            if(lavirint[i][j]=='X'){
                qvatra.push({i,j});
                vatra[i][j]=0;
            } else if(lavirint[i][j]=='S') {
                steva_start={i,j};
                qsteva.push(steva_start);
                steva[i][j]=0;
            }
        }
    }
    while(!qvatra.empty()){
        polje v = qvatra.front();
        qvatra.pop();
        rep(k,0,4) {
            int nr=v.r+x[k];
            int nk=v.k+y[k];
            if (nr>=0 && nr<n && nk>=0 && nk<m &&
                lavirint[nr][nk]=='.' && vatra[nr][nk]==-1) {
                vatra[nr][nk]=vatra[v.r][v.k]+1;
                qvatra.push({nr,nk});
            }
        }
    }
    int cnt = 0;
    while (!qsteva.empty()) {
        polje s = qsteva.front();
        qsteva.pop();
        rep(k,0,4) {
            int nr=s.r+x[k];
            int nk=s.k+y[k];
            if (nr>=0 && nr<n && nk>=0 && nk<m &&
                lavirint[nr][nk]=='.' && steva[nr][nk]==-1) {
                int t=steva[s.r][s.k]+1;
                if(vatra[nr][nk]==-1 || t<vatra[nr][nk]){
                    steva[nr][nk]=t;
                    qsteva.push({nr,nk});
                    cnt++;
                }
            }
        }
    }
    cout<<cnt+1;
    return 0;
}