#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <bits/stdc++.h>
#include <queue>

using namespace std;

void pisi(vector<vector<int>>& m)
{
    int n = m.size();
    int mm = m[0].size();
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < mm; j++)
        {
            cout << m[i][j] << " ";
        }
        cout << "\n";
    }
    cout << "\n";
}

int main()
{
    ios_base::sync_with_stdio(false);
    int n, m;
    cin >> n >> m;
    cin.ignore(); //zbog getline kasnije
    vector<string> blavirint(n);
    vector<vector<int>> kadbvatrastize(n, vector<int>(m, 42069));//ovo niko nece da cita ali ovde ne mogu kao covek da stavim -1 jer posle mora
    //da gledam da li je nesto manje od necega i normalno -1 ima da bude manje i pola 3 ujutru je spava mi se i ovaj propali red mi je bio greska
    //i onda mi brojac nije radilo........ milan pavlov
    vector<vector<int>> kadbstevastize(n, vector<int>(m, 42069));
    queue<pair<int, int>> vatrabrzina;
    queue<pair<int, int>> stevabrzina;
    pair<int, int> stevapoz;//saljem pozdrav stevi
    for (int i = 0; i < n; i++)
    {
        getline(cin, blavirint[i]);
        for (int j = 0; j < m; j++)
        {
            if (blavirint[i][j] == 'X')
            {
                kadbvatrastize[i][j] = 0;//ako je tu X znaci da je vatra vec stigla tu
                vatrabrzina.push({i, j});
            }
            else if (blavirint[i][j] == 'S')
            {
                kadbstevastize[i][j] = 0;
                stevapoz = {i, j};
                stevabrzina.push(stevapoz);
            }
        }
    }
    int dx[4] = {-1, 1, 0, 0};//bfs kretanje
    int dy[4] = {0, 0, -1, 1};
    //prvo popunjavamo jednu matricu gde se vidi za koliko poteza vatra moze gde da stigne,
    //zatim to isto radimo za stevu i ako steva stigne pre vatre sa elitrom onda br++
    while (!vatrabrzina.empty())
    {
        pair<int,int> prvi=vatrabrzina.front();
        vatrabrzina.pop();
        int x=prvi.first;
        int y=prvi.second;
        for (int i = 0; i < 4; i++)
        {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx >= 0 && nx < n && ny >= 0 && ny < m && blavirint[nx][ny] == '.' && kadbvatrastize[nx][ny] == 42069)
                //dimenzije,gledamo da nije zid i da nije vec neka vatra stigla
            {
                kadbvatrastize[nx][ny] = kadbvatrastize[x][y] + 1;//sledeci potez
                vatrabrzina.push({nx, ny});//dodajemo ga dok vise ne mozemo da dodajemo (sve su zidici ili sve je vatrenooo)
            }
        }
    }
    while (!stevabrzina.empty())
    {
        pair<int,int> bprvi=stevabrzina.front();
        stevabrzina.pop();
        int x=bprvi.first;
        int y=bprvi.second;
        for (int i = 0; i < 4; i++)
        {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx >= 0 && nx < n && ny >= 0 && ny < m && blavirint[nx][ny] == '.' && kadbstevastize[nx][ny] == 42069)
            {
                kadbstevastize[nx][ny] = kadbstevastize[x][y] + 1;
                stevabrzina.push({nx, ny});
            }
        }
    }
    int bbr = 1; //pocetno polje
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (blavirint[i][j] == '.' && kadbstevastize[i][j] < kadbvatrastize[i][j])
            {
                bbr++;
            }
        }
    }
    /*pisi(kadbvatrastize);
    pisi(kadbstevastize);*/ //jako debugovanje
    cout << bbr;
    return 0;
}