#include<bits/stdc++.h>
#define QwQ cout<<"QwQ"<<endl
using namespace std;
typedef pair<int,int> pii;
const int N=20,M=55;
const int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
int n,r,c,dis[N][N],dp[1<<(N-4)+5][N],vis[M][M],bel[M][M],inf=0x3f3f3f3f,ans=inf;
char mp[M][M];
vector<pii>island[N];
int main()
{
memset(dis,0x3f,sizeof(dis));
memset(dp,0x3f,sizeof(dp));
cin>>r>>c;
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
cin>>mp[i][j];
}
}
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
if(!vis[i][j]&&mp[i][j]=='X')
{
queue<pii>q;
q.push(make_pair(i,j));
while(!q.empty())
{
int x=q.front().first,y=q.front().second;
q.pop();
vis[x][y]=1;
bel[x][y]=n;
island[n].push_back(make_pair(x,y));
for(int k=0;k<4;k++)
{
int xx=x+dx[k],yy=y+dy[k];
if(xx>=1&&xx<=r&&yy>=1&&yy<=c&&!vis[xx][yy]&&mp[xx][yy]=='X')
{
q.push(make_pair(xx,yy));
}
}
}
n++;
}
}
}
for(int i=0;i<n;i++)
{
memset(vis,-1,sizeof(vis));
queue<pii>q;
for(int j=0;j<island[i].size();j++)
{
pii u=island[i][j];
q.push(u);
vis[u.first][u.second]=0;
}
dis[i][i]=0;
while(!q.empty())
{
int x=q.front().first,y=q.front().second;
q.pop();
for(int k=0;k<4;k++)
{
int xx=x+dx[k],yy=y+dy[k];
if(xx>=1&&xx<=r&&yy>=1&&yy<=c&&vis[xx][yy]==-1)
{
vis[xx][yy]=vis[x][y]+1;
if(mp[xx][yy]=='X')
{
int j=bel[xx][yy];
dis[i][j]=min(dis[i][j],vis[x][y]);
}
if(mp[xx][yy]=='S')
{
q.push(make_pair(xx,yy));
}
}
}
}
}
for(int k=0;k<n;k++)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
for(int i=0;i<n;i++)
{
dp[i][1<<i]=0;
}
for(int i=1;i<(1<<n);i++)
{
for(int j=0;j<n;j++)
{
if((1<<j)&i)
{
for(int k=0;k<n;k++)
{
if(!((1<<k)&i))
{
dp[k][i|(1<<k)]=min(dp[k][i|(1<<k)],dp[j][i]+dis[j][k]);
}
}
}
}
}
for(int i=0;i<n;i++)
{
ans=min(ans,dp[i][(1<<n)-1]);
}
cout<<ans;
return 0;
}