#include <bits/stdc++.h>

using namespace std;

/*
    0--startna poz
    1--gore
    2--desno
    3--dole
    4--levo
*/
void pozar(set<pair<int,int>>& s,vector<vector<char>> mat,vector<pair<int,int>> pozVatre,int smer,int x,int y,int n,int m)
{
    if(y<0 || x<0 || x>=m || y>=n)return;

    else if(mat[y][x]=='X' )return;

    else if(mat[y][x]=='*' )return;

    else if(s.count(make_pair(x,y)))return;



        s.insert(make_pair(x,y));
        vector<pair<int,int>> pozVatreS;

        for(int i=0; i<pozVatre.size(); i++)pozVatreS.push_back(pozVatre[i]);

        for(int i=0; i<pozVatreS.size(); i++)
        {
            int gd,ld;
            gd=pozVatreS[i].first;
            ld=pozVatreS[i].second;

            if(gd<n-1)
            {
                if(mat[gd+1][ld]!='*' && mat[gd+1][ld]!='X')
                {
                    mat[gd+1][ld]='X';
                    pozVatre.push_back(make_pair(gd+1,ld));
                }
            }


            if(ld<m-1)
            {
                if(mat[gd][ld+1]!='*' && mat[gd][ld+1]!='X')
                {
                    mat[gd][ld+1]='X';
                    pozVatre.push_back(make_pair(gd,ld+1));
                }

            }


            if(gd>0)
            {
                if(mat[gd-1][ld]!='*' && mat[gd-1][ld]!='X')
                {
                    mat[gd-1][ld]='X';
                    pozVatre.push_back(make_pair(gd-1,ld));
                }
            }


            if(ld>0)
            {
                if(mat[gd][ld-1]!='*' && mat[gd][ld-1]!='X')
                {
                    mat[gd][ld-1]='X';
                    pozVatre.push_back(make_pair(gd,ld-1));
                }
            }

        }
        switch(smer)
        {
            /*
    0--startna poz
    1--gore
    2--desno
    3--dole
    4--levo
*/
            case 0:
            {
                pozar(s,mat,pozVatre,1,x,y-1,n,m);
                pozar(s,mat,pozVatre,2,x+1,y,n,m);
                pozar(s,mat,pozVatre,3,x,y+1,n,m);
                pozar(s,mat,pozVatre,4,x-1,y,n,m);
                return;
            }
            case 1:
            {
                pozar(s,mat,pozVatre,1,x,y-1,n,m);
                pozar(s,mat,pozVatre,2,x+1,y,n,m);
                pozar(s,mat,pozVatre,4,x-1,y,n,m);
                return;
            }
            case 2:
            {
                pozar(s,mat,pozVatre,1,x,y-1,n,m);
                pozar(s,mat,pozVatre,2,x+1,y,n,m);
                pozar(s,mat,pozVatre,3,x,y+1,n,m);
                return;
            }
            case 3:
            {
                pozar(s,mat,pozVatre,2,x+1,y,n,m);
                pozar(s,mat,pozVatre,3,x,y+1,n,m);
                pozar(s,mat,pozVatre,4,x-1,y,n,m);
                return;
            }
            case 4:
            {
                pozar(s,mat,pozVatre,1,x,y-1,n,m);
                pozar(s,mat,pozVatre,3,x,y+1,n,m);
                pozar(s,mat,pozVatre,4,x-1,y,n,m);
                return;
            }
        }


}

int main()
{
    std::ios_base::sync_with_stdio(false);

    int n,m;
    cin >> n >> m;
    int xs,ys;

    vector<vector<char>> mat;
    vector<pair<int,int>> pozVatre;
    for(int i=0; i<n; i++)
    {
        vector<char> pomv;
        for(int j=0; j<m; j++)
        {
            char p;
            cin >> p;
            if(p=='S')
            {
                xs=j;
                ys=i;
                p='.';
            }
            if(p=='X')pozVatre.push_back(make_pair(i,j));
            pomv.push_back(p);
        }
        mat.push_back(pomv);
    }
    /*for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            cout << mat[i][j] << " ";
        }
        cout << endl;
    }*/
    set<pair<int,int>> posibilities;

    pozar(posibilities,mat,pozVatre,0,xs,ys,n,m);

    cout << posibilities.size() << endl;
    return 0;
}