#include<bits/stdc++.h>
using namespace std;
const unsigned int N=2e3;
bool vis[N][N];
int dis[N][N],n,m,sx,sy;
char s;
const int X[]={1,-1,0,0};
const int Y[]={0,0,1,-1};
queue<pair<int,int> >q;
bool tf(int x,int y){
return x>0&&y>0&&x<=n&&y<=m;
}
void init(){//初始化
for(register int i=1;i<=n;i++)
for(register int j=1;j<=m;j++)
dis[i][j]=-1;
}
void bfs(){
while(!q.empty()){
int tx=q.front().first;
int ty=q.front().second;
for(register int i=0;i<4;i++){
int tmp1=tx+X[i];
int tmp2=ty+Y[i];
if(tf(tmp1,tmp2)&&!vis[tmp1][tmp2]&&dis[tmp1][tmp2]==-1){
vis[tmp1][tmp2]=true;
dis[tmp1][tmp2]=dis[tx][ty]+1;
q.push(make_pair(tmp1,tmp2));
}
}
q.pop();
bfs();
}
}
int main(){
scanf("%d%d",&n,&m);
init();
for(register int i=1;i<=n;i++)
for(register int j=1;j<=m;j++){
cin>>s;
if(s=='#'){
vis[i][j]=true;//障碍
continue;
}
if(s=='m'){
q.push(make_pair(i,j));//起点
//vis[i][j]=true;
dis[i][j]=0;
continue;
}
if(s=='d'){
sx=i;
sy=j;
}
}
bfs();//广搜
!vis[sx][sy]?printf("No Way!\n"):printf("%d\n",dis[sx][sy]);
return 0;
}