#include <bits/stdc++.h>
using namespace std;
#define INF 1000000000
char c[1000][1000];
int posecenost[1000][1000];
int cnt;
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
queue< pair<int, int> > q;
queue<int> udaljenost;
bool posecen[1000][1000];


void bfs(int x, int y, int n, int m, int broj){
	posecenost[x][y] = broj;
	for(int i = 0; i < 4; i++){
		if((x + dx[i] >= 0 && x + dx[i] <= n-1) && (y + dy[i] >= 0 && y + dy[i] <= m-1) && (c[x+dx[i]][y+dy[i]] == '.' || c[x+dx[i]][y+dy[i]] == 'S') && posecenost[x+dx[i]][y+dy[i]] == INF){
			q.push(make_pair(x + dx[i], y + dy[i]));
			udaljenost.push(broj+1);
		}
	}
}

void bfsSteva(int x, int y, int n, int m, int broj){
	posecen[x][y] = true;
	if(broj < posecenost[x][y]) cnt++;
	for(int i = 0; i < 4; i++){
		if((x + dx[i] >= 0 && x + dx[i] <= n-1) && (y + dy[i] >= 0 && y + dy[i] <= m-1) && c[x+dx[i]][y+dy[i]] == '.' && posecen[x+dx[i]][y+dy[i]] != true){
			posecen[x+dx[i]][y+dy[i]] = true;
			q.push(make_pair(x+dx[i], y+dy[i]));
			udaljenost.push(broj+1);
		}
	}
}

int main(){
	int n, m; cin >> n >> m;
	int stevaX, stevaY;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++){
			cin >> c[i][j];
			if(c[i][j] == 'X'){
				q.push(make_pair(i, j));
				udaljenost.push(1);
			}
			else if(c[i][j] == 'S'){
				stevaX = i;
				stevaY = j;
			}
		}
	}
	for(int i = 0; i < 1000; i++){
		for(int j = 0; j < 1000; j++){
			posecenost[i][j] = INF;
		}
	}
	while(!q.empty()){
		bfs(q.front().first, q.front().second, n, m, udaljenost.front());
		q.pop();
		udaljenost.pop();
	}
	q.push(make_pair(stevaX, stevaY));
	udaljenost.push(1);
	while(!q.empty()){
		bfsSteva(q.front().first, q.front().second, n, m, udaljenost.front());
		q.pop();
		udaljenost.pop();
	}
	cout<<cnt;
}