#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
char map[205][205];
int count[205][205];
int a[205][205],b[205][205];
int m,n;
const int w=1e7;
int u[4][2]={1,0,-1,0,0,1,0,-1};
struct node{
int x,y;
int step;
};
int bfs(int x,int y,int e[205][205])
{
memset(count,0,sizeof(count));
queue<node>f;
node now;
now.x=x;
now.y=y;
now.step=0;
f.push(now);
count[x][y]=1;
while(!f.empty())
{
now=f.front();
f.pop();
for(int i=0;i<4;i++)
{
int dx=now.x+u[i][0];
int dy=now.y+u[i][1];
if(count[dx][dy]==0&&dx>=1&&dx<=m&&y>=1&&y<=n&&map[dx][dy]!='#')
{
node next;
next.x=dx;
next.y=dy;
count[next.x][next.y]=1;
e[dx][dy]=now.step+1;
next.step=now.step+1;
f.push(next);
}
}
}
}
int main()
{
int s,k1,k2,h1,h2,d1,d2,min,k;
while(cin>>m>>n)
{
min=w;
for(int i=1;i<=m;i++)
cin>>(map[i]+1);
s=1;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(map[i][j]=='Y')
{
k1=i;h1=j;
}
else
if(map[i][j]=='M')
{
k2=i;h2=j;
}
}
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
d1=bfs(k1,h1,a);
d2=bfs(k2,h2,b);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(map[i][j]=='@')
{
k=a[i][j]+b[i][j];
if(k<min)
min=k;
}
}
cout<<min*11<<endl;
}
}