#include<bits/stdc++.h>
using namespace std;
const int MP=35;
struct node{
int ax,ay;
int bx,by;
int sum;
}tn;
bool operator <(const node &a,const node &b){
return a.sum<b.sum;
}
int dxya[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int dxyb[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
char mp[MP][MP];
int n,m,asx,asy,bsx,bsy,ex,ey;
map<node,bool> vis;
void bfs(){
queue<node> q;
tn.ax=asx,tn.ay=asy;
tn.bx=bsx,tn.by=bsy;
tn.sum=0;
q.push(tn);
while(!q.empty()){
node tmp=q.front();q.pop();
int sum=tmp.sum;
int ax=tmp.ax,ay=tmp.ay;
int bx=tmp.bx,by=tmp.by;
if(vis[tmp]) continue;
tmp.sum=0;vis[tmp]=true;
if(ax==bx&&ay==by&&ax==ex&&ay==ey){
cout<<sum;return;
}
for(register int i=0;i<4;++i){
int tax=ax+dxya[i][0],tay=ay+dxya[i][1];
int tbx=bx+dxyb[i][0],tby=by+dxyb[i][1];
if(mp[tax][tay]=='X') continue;
if(mp[tbx][tby]=='X') continue;
if(mp[tax][tay]=='#') tax=ax,tay=ay;
if(mp[tbx][tby]=='#') tbx=bx,tby=by;
tn.ax=tax,tn.ay=tay;
tn.bx=tbx,tn.by=tby;
tn.sum=sum+1;
q.push(tn);
}
}
puts("no");
return;
}
inline bool islian(int x,int y,int xx,int yy){
queue<pair<int,int> > q;
q.push({x,y});
while(!q.empty()){
pair<int,int> tmp=q.front();q.pop();
int dx=tmp.first,dy=tmp.second;
if(dx==xx&&dy==yy) return true;
for(register int i=0;i<4;++i){
int tx=dx+dxya[i][0],ty=dy+dxya[i][1];
if(mp[tx][ty]=='#'||mp[tx][ty]=='X') continue;
q.push({tx,ty});
}
}
return false;
}
int main(){
cin>>n>>m;
for(register int i=1;i<=n;++i){for(register int j=1;j<=m;++j){
cin>>mp[i][j];
if(mp[i][j]=='M') asx=i,asy=j;
if(mp[i][j]=='G') bsx=i,bsy=j;
if(mp[i][j]=='T') ex=i,ey=j;
}}
if(!islian(asx,asy,ex,ey)||!islian(bsx,bsy,ex,ey)){
puts("no");return 0;
}
bfs();
return 0;
}
RT,MLE30分