#include<bits/stdc++.h>
#define int long long
using namespace std;
int gx,gy,mx,my;
bool vis[32][32][32][32];
char a[32][32];
int fx[]={1,-1,0,0};
int fy[]={0,0,1,-1};
int r,c;
struct node
{
int gx,gy,mx,my,step;
};
bool in(int x,int y)
{
return x>=1 && x<=r && y>=1 && y<=c;
}
signed main()
{
cin>>r>>c;
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
cin>>a[i][j];
if(a[i][j]=='G') gx=i,gy=j;
if(a[i][j]=='M') mx=i,my=j;
}
}
queue<node> q;
q.push({gx,gy,mx,my,0});
while(!q.empty())
{
auto t=q.front();
q.pop();
int gx=t.gx,gy=t.gy,mx=t.mx,my=t.my,step=t.step;
if(a[gx][gy]=='T' && a[mx][my]=='T')
{
cout<<step;
return 0;
}
for(int i=0;i<4;i++)
{
int ngx=gx+fx[i],ngy=gy+fy[i],nmx=mx+fx[i],nmy=my-fy[i];
if(in(ngx,ngy) && in(nmx,nmy) && a[ngx][ngy]!='X' && a[nmx][nmy]!='X' && !vis[ngx][ngy][nmx][nmy])
{
if(a[ngx][ngy]=='#' && a[nmx][nmy]=='#') continue;
vis[ngx][ngy][nmx][nmy]=1;
if(a[ngx][ngy]=='#') ngx=gx,ngy=gy;
if(a[nmx][nmy]=='#') nmx=mx,nmy=my;
q.push({ngx,ngy,nmx,nmy,step+1});
}
}
}
cout<<"no";
}