//kosturi izlaze iz grobova
#include <bits/stdc++.h>

using namespace std;
int n,m;
typedef long long ull;
vector<pair<int,int>> moves = {{-1,0},{1,0},{0,1},{0,-1}};
vector<vector<int>> stevo;
vector<vector<int>> vatra;
struct prc{
    int x,y,z;
};
void steeevo(vector<vector<char>> &a){
    int xx,yy,zz=0;
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            if(a[i][j]=='S'){
                xx=i; yy=j;
                goto dalje;
            }
        }
    }
    dalje:;
    stevo[xx][yy]=0;
    queue<prc> q;
    vector<vector<bool>> visited(n,vector<bool>(m,false));
    visited[xx][yy]=true;
    prc prc1;
    prc1.x=xx;
    prc1.y=yy;
    prc1.z=0;
    q.push(prc1);
    while(!q.empty()){
        xx = q.front().x; yy = q.front().y; zz = q.front().z;
        q.pop();
        for(pair<int,int> mov : moves){
            if((0<=xx + mov.first && xx+mov.first<n && 0<=yy+mov.second && yy+mov.second<m) && !visited[xx+mov.first][yy+mov.second] && a[xx+mov.first][yy+mov.second]!='*' && a[xx+mov.first][yy+mov.second]!='X'){
                visited[xx+mov.first][yy+mov.second]=true;
                prc1.x=xx+mov.first;
                prc1.y=yy+mov.second;
                prc1.z=zz+1;
                q.push(prc1);
                stevo[xx+mov.first][yy+mov.second]=zz+1;
               }
        }
    }
}

void vaatra(vector<vector<char>> &a){
    int xx,yy,zz=0;
    queue<prc> q;
    vector<vector<bool>> visited(n,vector<bool>(m,false));
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            if(a[i][j]=='X'){
                prc prc1;
                prc1.x=i;
                prc1.y=j;
                prc1.z=0;
                visited[i][j]=true;
                vatra[i][j]=0;
                q.push(prc1);
            }
        }
    }
    while(!q.empty()){
        xx = q.front().x; yy = q.front().y; zz = q.front().z;
        q.pop();
        for(pair<int,int> mov : moves){
            if((0<=xx + mov.first && xx+mov.first<n && 0<=yy+mov.second && yy+mov.second<m) && !visited[xx+mov.first][yy+mov.second] && a[xx+mov.first][yy+mov.second]!='*'){
                visited[xx+mov.first][yy+mov.second]=true;
                prc prc1;
                prc1.x=xx+mov.first;
                prc1.y=yy+mov.second;
                prc1.z=zz+1;
                q.push(prc1);
                vatra[xx+mov.first][yy+mov.second]=zz+1;
               }
        }
    }
}

int main() {
    cin >> n >> m;
    vector<vector<char>> a(n,vector<char>(m));
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            cin >> a[i][j];
        }
    }
    stevo.resize(n);
    for(auto& s : stevo)s.resize(m,-1);
    steeevo(a);
    vatra.resize(n);
    for(auto& s : vatra)s.resize(m,-1);
    vaatra(a);
    int sol=0;
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            if((vatra[i][j]==-1 || stevo[i][j] < vatra[i][j]) && stevo[i][j]!=-1)sol++;
        }
    }
    cout << sol << '\n';
    return 0;
}