#include <bits/stdc++.h>
using namespace std;

bool zauzeto[1005][1005] = {false};

bool moguce(int x, int y, int n, int m)
{
	if (x<0 || x>=n || y<0 || y>=m) return false;
	if (zauzeto[x][y]) return false;
	return true;
}

int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};

int main()
{
	int n, m;
	cin >> n >> m;
	char lavirint[n][m];
	queue<pair<int,int>> q;
	for (int i=0; i<n; i++)
		for (int j=0; j<m; j++)
		{
			cin >> lavirint[i][j];
			if (lavirint[i][j] == 'X')
			{
				q.push({i,j});
				zauzeto[i][j] = true;
			}
			if (lavirint[i][j] == '*')
				zauzeto[i][j] = true;
		}
	for (int i=0; i<n; i++)
		for (int j=0; j<m; j++)
		{
			if (lavirint[i][j] == 'S')
			{
				q.push({i,j});
				zauzeto[i][j] = true;
				break;
			}
		}
	int polja = 1;
	while (!q.empty())
	{
		int koordX = q.front().first;
		int koordY = q.front().second;
		q.pop();
		
		if (lavirint[koordX][koordY] == 'S')
		{
			for (int i=0; i<4; i++)
			{
				if (moguce(koordX + dx[i], koordY + dy[i], n, m))
				{
					zauzeto[koordX + dx[i]][koordY + dy[i]] = true;
					lavirint[koordX + dx[i]][koordY + dy[i]] = 'S';
					q.push({koordX + dx[i], koordY + dy[i]});
					polja++;
				}
			}
		}
		else
		{
			for (int i=0; i<4; i++)
			{
				if (moguce(koordX + dx[i], koordY + dy[i], n, m))
				{
					zauzeto[koordX + dx[i]][koordY + dy[i]] = true;
					q.push({koordX + dx[i], koordY + dy[i]});
				}
			}
		}
	}
	
	cout << polja << endl;			
	
	return 0;
}