#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int sp[111][111];
int dp[111][111][1<<5];
int w,h;
int in(int y,int x){
  return 0<=y&&y<h&&0<=x&&x<w;
}
struct sta{
  int y,x,b,d;
  sta(){}
  sta(int y,int x,int b,int d):y(y),x(x),b(b),d(d){}
  bool operator<(const sta& a) const{
    return d>a.d;
  }
};
typedef pair<int,int> P;
int main(){
  memset(sp,0,sizeof(sp));
  memset(dp,-1,sizeof(dp));
  cin>>w>>h;
  string st[h];
  for(int i=0;i<h;i++) cin>>st[i];
  int sy,sx,gy,gx,n=0;
  map<P,int> m;
  for(int i=0;i<h;i++){
    for(int j=0;j<w;j++){
      sp[i][j]=max(sp[i][j],1);
      if(st[i][j]=='M') m[P(i,j)]=n++;
      if(st[i][j]=='S') sy=i,sx=j;
      if(st[i][j]=='G') gy=i,gx=j;
      if(st[i][j]=='#'){
	for(int k=1;k<=3;k++){
	  for(int a=-(4-k);a<=4-k;a++){
	    if(in(i-(4-k),j+a)) sp[i-(4-k)][j+a]=max(sp[i-(4-k)][j+a],k);
	    if(in(i+(4-k),j+a)) sp[i+(4-k)][j+a]=max(sp[i+(4-k)][j+a],k);
	    if(in(i+a,j-(4-k))) sp[i+a][j-(4-k)]=max(sp[i+a][j-(4-k)],k);
	    if(in(i+a,j+(4-k))) sp[i+a][j+(4-k)]=max(sp[i+a][j+(4-k)],k);
	  }
	}
      }
    }
  }
  /*//
  for(int i=0;i<h;i++){
    for(int j=0;j<w;j++){
      cout<<sp[i][j];
    }
    cout<<endl;
  }
  //*/
  priority_queue<sta> q;
  q.push(sta(sy,sx,0,0));
  dp[sy][sx][0]=0;
  int ax[]={1,-1,0,0};
  int ay[]={0,0,1,-1};
  while(!q.empty()){
    sta s=q.top();q.pop();
    if(dp[s.y][s.x][s.b]<s.d) continue;
    //cout<<s.y<<" "<<s.x<<" "<<s.b<<" "<<s.d<<endl;
    for(int k=0;k<4;k++){
      int ny=s.y+ay[k],nx=s.x+ax[k],nb=s.b,nd=s.d+sp[s.y][s.x];
      if(!in(ny,nx)) continue;
      if(st[ny][nx]=='#') continue;
      if(m.count(P(ny,nx))) nb|=1<<m[P(ny,nx)];
      if(dp[ny][nx][nb]<0||dp[ny][nx][nb]>nd){
	dp[ny][nx][nb]=nd;
	q.push(sta(ny,nx,nb,nd));
      }
    }
  }
  cout<<dp[gy][gx][(1<<n)-1]<<endl;
  return 0;
}