#include<bits/stdc++.h>
using namespace std;
struct point{
int x,y;
}start,end;
int P[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int mp[310][310],m,n,ans;
char x;
point trans[130][2];
int trans_num[130];
int dfs(point now,int time){
if(now.x==end.x&&now.y==end.y){
ans=min(time,ans);
}
for(int i=0;i<=3;i++){
if(mp[now.x+P[i][0]][now.y+P[i][1]]){
if(trans[mp[now.x+P[i][0]][now.y+P[i][1]]][0].x&&trans[mp[now.x+P[i][0]][now.y+P[i][1]]][1].x){
if(trans[mp[now.x+P[i][0]][now.y+P[i][1]]][0].x==now.x&&trans[mp[now.x+P[i][0]][now.y+P[i][1]]][0].y==now.y){
dfs(trans[mp[now.x+P[i][0]][now.y+P[i][1]]][1],time+1);
}
else{
dfs(trans[mp[now.x+P[i][0]][now.y+P[i][1]]][0],time+1);
}
}
else{
point f5_now;
f5_now.x=now.x+P[i][0];
f5_now.y=now.y+P[i][1];
dfs(f5_now,time+1);
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>x;
if(x=='#'){
mp[i][j]=0;
continue;
}
if(x=='.'){
mp[i][j]=1;
continue;
}
if(x=='@'){
mp[i][j]=1;
start.x=i,start.y=j;
continue;
}
if(x=='='){
mp[i][j]=1;
end.x=i,end.y=j;
continue;
}
else{
mp[i][j]=(int)x;
trans[(int)x][trans_num[(int)x]].x=i;
trans[(int)x][trans_num[(int)x]].y=j;
trans_num[(int)x]++;
continue;
}
}
}
dfs(start,0);
return 0;
}