#include <bits/stdc++.h>
#define maxn 1000009
using namespace std;
int viss[maxn] ;
int visv[maxn] ;
int dists[maxn] ;
int distv[maxn] ;
vector<int> adj[maxn] ;
void bfss(int poc){
    viss[poc]=1 ;
    queue<int> bfsq ;
    bfsq.push(poc) ;
    while(!bfsq.empty()){
        int node=bfsq.front() ;
        bfsq.pop() ;
        for(int x:adj[node]){
            if(viss[x]==0){
                dists[x]=dists[node]+1 ;
                viss[x]=1 ;
                bfsq.push(x) ;
            }
        }
    }

}
void bfsv(int poc){
    visv[poc]=1 ;
    queue<int> bfsq ;
    bfsq.push(poc) ;
    while(!bfsq.empty()){
        int node=bfsq.front() ;
        bfsq.pop() ;
        for(int x:adj[node]){
            if(visv[x]==0){
                distv[x]=distv[node]+1 ;
                visv[x]=1 ;
                bfsq.push(x) ;
            }
        }
    }

}

int main()
{
    ios::sync_with_stdio(false) ;
    cin.tie(0) ;
    cout.tie(0) ;
    int n , m  ;
    cin >> n >> m ;
    char mat[n][m] ;
    for(int i=0; i<n ; i++){
        for(int j=0 ; j<m ; j++){
            cin >> mat[i][j] ;
        }
    }
    int s ;
    for(int i=0 ; i<n ; i++){
        for(int j=0 ; j<m ; j++){
            if(mat[i][j]=='S'){
                s=i*m+j ;
            }
            if(i>0){
                if(mat[i][j]=='X'){
                    if(mat[i-1][j]!='*'){
                        adj[1000005].push_back((i-1)*m+j) ;
                    }
                }
                else{
                   if(mat[i-1][j]!='*'){
                        if(mat[i-1][j]=='X'){
                            if(mat[i][j]=='.'){
                            adj[i*m+j].push_back(1000005) ;
                            }
                        }
                        else{
                            adj[i*m+j].push_back((i-1)*m+j) ;
                        }
                    }
                }
            }
            if(j>0){
                if(mat[i][j]=='X'){
                    if(mat[i][j-1]!='*'){
                        adj[1000005].push_back(i*m+j-1) ;
                    }
                }
                else{
                   if(mat[i][j-1]!='*'){
                        if(mat[i][j-1]=='X'){
                            if(mat[i][j]=='.'){
                            adj[i*m+j].push_back(1000005) ;
                            }
                        }
                        else{
                            adj[i*m+j].push_back(i*m+j-1) ;
                        }
                    }
                }
            }
            if(i<n-1){
                if(mat[i][j]=='X'){
                    if(mat[i+1][j]!='*'){
                        adj[0].push_back((i+1)*m+j) ;
                    }
                }
                else{
                   if(mat[i+1][j]!='*'){
                        if(mat[i+1][j]=='X'){
                            if(mat[i][j]=='.'){
                            adj[i*m+j].push_back(1000005) ;
                            }
                        }
                        else{
                        adj[i*m+j].push_back((i+1)*m+j) ;
                        }
                    }
                }
            }
            if(j<m-1){
                if(mat[i][j]=='X'){
                    if(mat[i][j+1]!='*'){
                        adj[1000005].push_back(i*m+j+1) ;
                    }
                }
                else{
                   if(mat[i][j+1]!='*'){
                        if(mat[i][j+1]=='X'){
                            if(mat[i][j]=='.'){
                            adj[i*m+j].push_back(1000005) ;
                            }
                        }
                        else{
                        adj[i*m+j].push_back(i*m+j+1) ;
                        }
                    }
                }
            }
        }
    }
    bfss(s) ;
    bfsv(1000005) ;
    int br ;
    for(int i=0 ; i<n*m ; i++){
        //cout << dists[i] << " " << distv[i] << " " << i <<endl ;
        //cout << viss[i] << " " << visv[i] << " " << i <<endl ;
        if(dists[i]<distv[i]&& viss[i]==1){
            br++ ;
        }
        if(viss[i]==1 && visv[i]==0){
            br++ ;
        }
    }
    cout << br  ;
    return 0;
}