#include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
#include<stack>
#define MAXN 40010
using namespace std;
int a[210][210];
int n,m;
struct Point{
int x,y;
};
int x1,y1,x2,y2;
int l;
stack<Point>sta;
int vis[210][210];
int stepx[210];
int stepy[210];
int judge(int xx,int yy)
{
if(xx<0||yy<0||xx>=n||yy>=m)
return 0;
if(a[xx][yy]==0)
return 0;
return 1;
}
int bfs(int sx,int sy,int ex,int ey)
{
if(sx==ex&&sy==ey)
{
return vis[sx][sy];
}
else
{
int firstx=0,firsty=0;
int lastx=0,lasty=0;
stepx[firstx++]=sx;
stepy[firsty++]=sy;
while(1)
{
int xs=stepx[lastx++];
int ys=stepy[lasty++];
if(xs==ex&&ys==ey)
return vis[xs][ys];
if(judge(xs+1,ys)&&(!vis[xs+1][ys]))
{
vis[xs+1][ys]=vis[xs][ys]+1;
stepx[firstx++]=xs+1;
stepy[firsty++]=ys;
}
if(judge(xs-1,ys)&&(!vis[xs-1][ys]))
{
vis[xs-1][ys]=vis[xs][ys]+1;
stepx[firstx++]=xs-1;
stepy[firsty++]=ys;
}
if(judge(xs,ys+1)&&(!vis[xs][ys+1]))
{
vis[xs][ys+1]=vis[xs][ys]+1;
stepx[firstx++]=xs;
stepy[firsty++]=ys+1;
}
if(judge(xs,ys-1)&&(!vis[xs][ys-1]))
{
vis[xs][ys-1]=vis[xs][ys]+1;
stepx[firstx++]=xs;
stepy[firsty++]=ys-1;
}
}
}
}
char s[210][210];
int main()
{
while(scanf("%d %d",&n,&m)==2)
{
memset(s,0,sizeof(s));
memset(a,0,sizeof(a));
memset(stepx,0,sizeof(stepx));
memset(stepy,0,sizeof(stepy));
memset(vis,0,sizeof(vis));
for(int i=0;i<n;++i)
scanf("%s",s[i]);
for(int i=0;i<n;++i)
{
for(int j=0;j<m;++j)
{
if(s[i][j]=='Y')
{
a[i][j]=3;
x1=i;
y1=j;
}
if(s[i][j]=='M')
{
a[i][j]=4;
x2=i;
y2=j;
}
if(s[i][j]=='#')
{
a[i][j]=0;
}
if(s[i][j]=='.')
{
a[i][j]=1;
}
if(s[i][j]=='@')
{
a[i][j]=5;
Point p;
p.x=i;
p.y=j;
sta.push(p);
}
}
}
l=MAXN;
while(!sta.empty())
{ int x3=sta.top().x;
int y3=sta.top().y;
// memset(a,0,sizeof(a));
memset(stepx,0,sizeof(stepx));
memset(stepy,0,sizeof(stepy));
memset(vis,0,sizeof(vis));
int l1=bfs(x1,y1,x3,y3);
// memset(a,0,sizeof(a));
memset(stepx,0,sizeof(stepx));
memset(stepy,0,sizeof(stepy));
memset(vis,0,sizeof(vis));
int l2=bfs(x2,y2,x3,y3);
sta.pop();
if(l1+l2<l)
l=l1+l2;
}
printf("%d\n",l*11);
}
return 0;
}