#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
vector<int>vis(1e6);

void dfssteve(int cnt,int s,vector<int>&steve,vector<int>g[]){
if(vis[s]==true)
return;
vis[s]=true;
steve[s]=cnt;
for(auto u: g[s])
    dfssteve(cnt+1,u,steve,g);

}

void dfsvatra(int cnt,int s,vector<int>&vatra,vector<int>g[]){
if(vis[s]==true)
return;
vis[s]=true;
vatra[s]=cnt;
for(auto u: g[s])
    dfsvatra(cnt+1,u,vatra,g);

}

signed main()
{
ios::sync_with_stdio(0);cin.tie(0);
vector<int>vatra(1e6);
vector<int>steve(1e6);

int n,m;
cin>>n>>m;
vector<int>g[n*m];
char b[n][m];
int steve1,vatra1=-1;
for(int i = 0;i<n;i++)
    for(int j = 0;j<m;j++){
        cin>>b[i][j];
        if(b[i][j]=='S')
            steve1=i*m+j;
        if(b[i][j]=='X')
            vatra1=i*m+j;

    }

for(int i = 0;i<n;i++){
    for(int j = 0;j<m;j++){
        if(b[i][j]!='*'){
            if(b[i][j+1]!='*'&&j+1<m){
                g[i*m+j].push_back(i*m+j+1);
                g[i*m+j+1].push_back(i*m+j);
            }
            if(b[i][j-1]!='*'&&j-1>=0){
                g[i*m+j].push_back(i*m+j-1);
                g[i*m+j-1].push_back(i*m+j);
            }
            if(b[i+1][j]!='*'&&i+1<n){
                g[i*m+j].push_back((i+1)*m+j);
                g[(i+1)*m+j].push_back(i*m+j);
            }
            if(b[i-1][j]!='*'&&i-1>=0){
                g[i*m+j].push_back((i-1)*m+j);
                g[(i-1)*m+j].push_back(i*m+j);
            }

        }


    }








}
dfssteve(0,steve1,steve,g);
fill(vis.begin(), vis.end(), 0);
if(vatra1!=-1)
dfsvatra(0,vatra1,vatra,g);
//for(int i = 0;i<n*m;i++)
//cout<<vatra[i]<<" ";
//cout<<endl;
//for(int i = 0;i<n*m;i++)
//cout<<steve[i]<<" ";
//cout<<endl;
int cnt=0;
for(int i = 0;i<n*m;i++)
    if(vatra[i]>steve[i])
    cnt++;
cout<<cnt<<endl;


return 0;
}