#include<bits/stdc++.h>
using namespace std;
const int N=50,M=15;
bool vis[N][M];
int r,c,wat[N][N],X[N][N],fdis[N][N];
int n,f[1<<M][M],dist[M][M];
int way[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
priority_queue<pair<int,pair<int,int>>,vector<pair<int,pair<int,int> > >,greater<pair<int,pair<int,int> > > > q;
void gm(int &a,int b){
a=min(a,b);
}
void dfs(int x,int y){
if(!(x>=0&&x<r&&y>=0&&y<c)||wat[x][y]||vis[x][y]) return ;
vis[x][y]=true;
X[x][y]=n;
for(int i=0;i<4;i++)
dfs(x+way[i][0],y+way[i][1]);
}
void dijkstra(int t){
memset(vis,false,sizeof(vis));
memset(fdis,0x3f,sizeof(fdis));
int x,y,xx,yy,fd;
for(x=0;x<r;x++){
for(y=0;y<c;y++){
if(X[x][y]==t){
fdis[x][y]=0;
q.push(make_pair(0,make_pair(x,y)));
}
}
}
while(!q.empty()){
x=q.top().second.first;
y=q.top().second.second;
q.pop();
if(vis[x][y]) continue;
vis[x][y]=true;
fd=fdis[x][y];
if(!wat[x][y]) gm(dist[t][X[x][y]],fd);
for(int i=0;i<4;i++){
xx=x+way[i][0];
yy=y+way[i][1];
if(xx>=0&&xx<r&&yy>=0&&yy<c&&wat[xx][yy]>=0&&fd+wat[xx][yy]<fdis[xx][yy]){
fdis[xx][yy]=fd+wat[xx][yy];
q.push(make_pair(fdis[xx][yy],make_pair(xx,yy)));
}
}
}
}
int main(){
memset(dist,0x3f,sizeof(dist));
char w;
cin>>r>>c;
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
cin>>w;
if(w=='S') wat[i][j]=1;
else if(w=='.') wat[i][j]=-1;
}
}
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
if(wat[i][j]) X[i][j]=-1;
else if(!vis[i][j]){
dfs(i,j);
n++;
}
}
}
for(int i=0;i<n;i++) dijkstra(i);
memset(f,0x3f,sizeof(f));
int ans=INT_MAX,maxx=1<<n;
for(int i=0;i<n;i++) f[1<<i][i]=0;
for(int i=1;i<maxx;i++){
for(int j=0;j<n;j++){
if(f[i][j]!=1061109567){
for(int k=0;k<n;k++){
if(!(i&(1<<k))){
gm(f[i|(1<<k)][k],f[i][j]+dist[j][k]);
}
}
}
}
}
maxx--;
for(int i=0;i<n;i++){
gm(ans,f[maxx][i]);
}
cout<<ans;
}