#include<iostream>
#include<vector>
#include<queue>
using namespace std;
static void bfs(int poc,vector<vector<int>>&g,int a[],bool posecen[],int &br)
{
    queue<int>q;
    q.push(poc);
    posecen[poc]=true;
    q.push(-1);
    while(!q.empty())
    {
        poc=q.front();
        q.pop();
        if(poc==-1)
        {
            br++;
            q.push(-1);
            poc=q.front();
            q.pop();
        }
        if(a[poc]==-1)
            break;
        for(int i=0;i<g[poc].size();i++)
        {
            if(!posecen[g[poc][i]])
            {
                posecen[g[poc][i]]=true;
                q.push(g[poc][i]);
            }
        }

    }
}
int main()
{
    int n,m;
    cin>>n>>m;
    string Lebron[n];
    int a[n*m];
    int steva;
    bool posecen[n*m];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
            posecen[i*m+j]=false;
    }
    for(int i=0;i<n;i++)
    {
        cin>>Lebron[i];
        for(int j=0;j<m;j++)
        {
            if(Lebron[i][j]=='.')
                a[i*m+j]=0;
            else if(Lebron[i][j]=='*')
                a[i*m+j]=1;
            else if(Lebron[i][j]=='X')
                {
                    a[i*m+j]=-1;
                }
            else
                {
                    a[i*m+j]=0;
                    steva=i*m+j;
                }
        }
    }
    vector<vector<int>> g(n*m);
    vector<vector<int>> graf;

    for(int i=0;i<n;i++)
    {

        for(int j=0;j<m;j++)
        {

            if(a[i*m+j]!=1)
            {
                if(i>0)
                    g[i*m+j].push_back((i-1)*m+j);
                if(j>0)
                    g[i*m+j].push_back(i*m+j-1);
                if(i<n-1)
                    g[i*m+j].push_back((i+1)*m+j);
                if(j<m-1)
                    g[i*m+j].push_back(i*m+j+1);
                graf.push_back(g[i*m+j]);
            }

        }
    }
    int br=0;
    bfs(steva,g,a,posecen,br);
    cout<<br<<endl;
}