#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
int ijk[110][110][32];
int v[110][110][32];
int t[110][110];
int ch[110][110];
char str[110][110];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int ABS(int a){return max(a,-a);}
int main(){
	int a,b;scanf("%d%d",&b,&a);
	for(int i=0;i<a;i++)scanf("%s",str[i]);
	int sz=0;
	int sr,sc,gr,gc;
	for(int i=0;i<a;i++)for(int j=0;j<b;j++)ch[i][j]=-1;
	for(int i=0;i<a;i++)for(int j=0;j<b;j++){
		t[i][j]=max(t[i][j],1);
		if(str[i][j]=='M')ch[i][j]=sz++;
		if(str[i][j]=='S'){
			sr=i;sc=j;
		}
		if(str[i][j]=='G'){
			gr=i;gc=j;
		}
		if(str[i][j]=='#'){
			for(int k=0;k<a;k++)for(int l=0;l<b;l++){
				t[k][l]=max(t[k][l],4-max(ABS(k-i),ABS(l-j)));
			}
		}
	}
	for(int i=0;i<a;i++)for(int j=0;j<b;j++)for(int k=0;k<(1<<sz);k++){
		ijk[i][j][k]=999999999;
	}
	ijk[sr][sc][0]=0;
	priority_queue<pair<pair<int,int>,pair<int,int> > >Q;
	Q.push(make_pair(make_pair(0,0),make_pair(sr,sc)));
	while(Q.size()){
		int cost=-Q.top().first.first;
		int bit=Q.top().first.second;
		int row=Q.top().second.first;
		int col=Q.top().second.second;
		Q.pop();
		if(v[row][col][bit])continue;
		v[row][col][bit]=1;
		for(int i=0;i<4;i++){
			if(row+dx[i]<0||row+dx[i]>=a||col+dy[i]<0||col+dy[i]>=b||str[row+dx[i]][col+dy[i]]=='#')continue;
			int tb=bit;
			if(~ch[row+dx[i]][col+dy[i]])tb|=(1<<ch[row+dx[i]][col+dy[i]]);
			if(!v[row+dx[i]][col+dy[i]][tb]&&ijk[row+dx[i]][col+dy[i]][tb]>cost+t[row][col]){
				ijk[row+dx[i]][col+dy[i]][tb]=cost+t[row][col];
				Q.push(make_pair(make_pair(-cost-t[row][col],tb),make_pair(row+dx[i],col+dy[i])));
			}
		}
	}
	printf("%d\n",ijk[gr][gc][(1<<sz)-1]);
}