#include <bits/stdc++.h>
using namespace std;
char a[1000][1000];
int b[1000][1000];
int c[1000][1000];

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cerr.tie(nullptr);
    int n, m;
    cin >> n >> m;
    int p = n * m;
    int x = 0, y = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++) {
            cin >> a[i][j];
            if (a[i][j] == 'S') {
                x = i;
                y = j;
            }
        }
    if (n == 1) {
        int levo = 0;
        int desno = 0;
        int j;
        for (j = y - 1; j >= 0 && a[0][j] == '.'; j--);
        levo = y - j - 1;
        if (j >= 0 && a[0][j] == 'X')
            levo /= 2;
        for (j = y + 1; j < m && a[0][j] == '.'; j++);
        desno = j - y - 1;
        if (j < m && a[0][j] == 'X')
            desno /= 2;
        cout << levo + desno + 1 << '\n';
    }
    else if (p < 200) {
        int ista = 0;
        while (ista < p) {
            ista = 0;
            for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++) {
                if (a[i][j] == '.') {
                    if (i > 0 && a[i - 1][j] == 'X')
                        a[i][j] = 'Y';
                    else if (i < n - 1 && a[i + 1][j] == 'X')
                        a[i][j] = 'Y';
                    else if (j > 0 && a[i][j - 1] == 'X')
                        a[i][j] = 'Y';
                    else if (j < m - 1 && a[i][j + 1] == 'X')
                        a[i][j] = 'Y';
                    else if (i > 0 && a[i - 1][j] == 'S')
                        a[i][j] = 'Z';
                    else if (i < n - 1 && a[i + 1][j] == 'S')
                        a[i][j] = 'Z';
                    else if (j > 0 && a[i][j - 1] == 'S')
                        a[i][j] = 'Z';
                    else if (j < m - 1 && a[i][j + 1] == 'S')
                        a[i][j] = 'Z';
                }
            }
            for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++) {
                if (a[i][j] == 'Y')
                    a[i][j] = 'X';
                else if (a[i][j] == 'Z')
                    a[i][j] = 'S';
                else
                    ista++;
            }
        }
        int br = 0;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
            if (a[i][j] == 'S')
            br++;
        cout << br << '\n';
    }
    else {
        queue<pair<int, int> > red;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++) {
                b[i][j] = INT_MAX;
                c[i][j] = INT_MAX;
            }
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                if (a[i][j] == 'X') {
                    red.push({i, j});
                    b[i][j] = 0;
                }
        while (!red.empty()) {
            int vrsta = red.front().first;
            int kolona = red.front().second;
            red.pop();
            if (vrsta - 1 >= 0 && a[vrsta - 1][kolona] != '*' && b[vrsta - 1][kolona] == INT_MAX) {
                b[vrsta - 1][kolona] = b[vrsta][kolona] + 1;
                red.push({vrsta - 1, kolona});
            }
            if (vrsta + 1 < n && a[vrsta + 1][kolona] != '*' && b[vrsta + 1][kolona] == INT_MAX) {
                b[vrsta + 1][kolona] = b[vrsta][kolona] + 1;
                red.push({vrsta + 1, kolona});
            }
            if (kolona - 1 >= 0 && a[vrsta][kolona - 1] != '*' && b[vrsta][kolona - 1] == INT_MAX) {
                b[vrsta][kolona - 1] = b[vrsta][kolona] + 1;
                red.push({vrsta, kolona - 1});
            }
            if (kolona + 1 < m && a[vrsta][kolona + 1] != '*' && b[vrsta][kolona + 1] == INT_MAX) {
                b[vrsta][kolona + 1] = b[vrsta][kolona] + 1;
                red.push({vrsta, kolona + 1});
            }
        }
        red.push({x, y});
        c[x][y] = 0;
        int br = 0;
        while (!red.empty()) {
            int vrsta = red.front().first;
            int kolona = red.front().second;
            red.pop();
            if (c[vrsta][kolona] < b[vrsta][kolona]) {
                br++;
                if (vrsta - 1 >= 0 && a[vrsta - 1][kolona] == '.' && c[vrsta - 1][kolona] == INT_MAX) {
                    c[vrsta - 1][kolona] = c[vrsta][kolona] + 1;
                    red.push({vrsta - 1, kolona});
                }
                if (vrsta + 1 < n && a[vrsta + 1][kolona] == '.' && c[vrsta + 1][kolona] == INT_MAX) {
                    c[vrsta + 1][kolona] = c[vrsta][kolona] + 1;
                    red.push({vrsta + 1, kolona});
                }
                if (kolona - 1 >= 0 && a[vrsta][kolona - 1] == '.' && c[vrsta][kolona - 1] == INT_MAX) {
                    c[vrsta][kolona - 1] = c[vrsta][kolona] + 1;
                    red.push({vrsta, kolona - 1});
                }
                if (kolona + 1 < m && a[vrsta][kolona + 1] == '.' && c[vrsta][kolona + 1] == INT_MAX) {
                    c[vrsta][kolona + 1] = c[vrsta][kolona] + 1;
                    red.push({vrsta, kolona + 1});
                }
            }
        }
        cout << br << '\n';
    }
    return 0;
}