#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;

#define INF (1<<29)

int cost[102][102];
char g[102][102];

int d[102][102][1<<5];

int main(){
	int h,w;
	int sy,sx;
	int cnt=0;
	cin>>w>>h;
	for(int i=0;i<=h+1;i++)
		for(int j=0;j<=w+1;j++)
			cost[i][j]=1,g[i][j]='#';
	for(int i=1;i<=h;i++){
		for(int j=1;j<=w;j++){
			cin>>g[i][j];
			if(g[i][j]=='#'){
				for(int dy=-2;dy<=2;dy++){
					for(int dx=-2;dx<=2;dx++){
						if(!dy&&!dx)continue;
						if(i+dy<1||h<i+dy||j+dx<1||w<j+dx)continue;
						cost[i+dy][j+dx]=max(cost[i+dy][j+dx],4-max(abs(dy),abs(dx)));
					}
				}
			}else if(g[i][j]=='S'){
				sy=i;
				sx=j;
			}else if(g[i][j]=='M'){
				g[i][j]='0'+cnt++;
			}
		}
	}
	int dy[]={1,0,-1,0};
	int dx[]={0,1,0,-1};
	int ans=-1,qidx=0;
	queue<pair<pair<int,int>,int> > q[4];
	q[0].push(make_pair(make_pair(sy,sx),0));
	fill((int*)d,(int*)(d+102),INF);
	d[sy][sx][0]=0;
	while(1){
		while(q[qidx].empty())qidx=(qidx+1)&3;
		pair<pair<int,int>,int> a,b;
		a=q[qidx].front();
		q[qidx].pop();
		if(g[a.first.first][a.first.second]=='G'&&(1<<cnt)-1==a.second){
			ans=d[a.first.first][a.first.second][a.second];
			break;
		}
		for(int i=0;i<4;i++){
			b=a;
			b.first.first+=dy[i];
			b.first.second+=dx[i];
			int y=b.first.first;
			int x=b.first.second;
			if(g[y][x]=='#')continue;
			if('0'<=g[y][x]&&g[y][x]<'5')b.second|=1<<g[y][x]-'0';
			int c=cost[a.first.first][a.first.second];
			if(d[a.first.first][a.first.second][a.second]+c<d[y][x][b.second]){
				d[y][x][b.second]=d[a.first.first][a.first.second][a.second]+c;
				q[(qidx+c)&3].push(b);
			}
		}
	}
	cout<<ans<<endl;	
	return 0;
}