#include <bits/stdc++.h>
using namespace std;
int n,m,vis[310][310];
char a[310][310];
struct nod{
int x,y,t;
};
queue<nod>q;
int dx[4]={1,0,0,-1};
int dy[4]={0,1,-1,0};
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='@'){
nod begin;
begin.x=i;
begin.y=j;
begin.t=0;
vis[i][j]=1;
q.push(begin);
}
}
}
int flag=0;
while(q.empty()==0){
nod now=q.front();
q.pop();
for(int i=0;i<4;i++){
nod nxt;
nxt.x=now.x+dx[i];
nxt.y=now.y+dy[i];
nxt.t=now.t+1;
if(nxt.x>=1&&nxt.x<=n&&nxt.y>=1&&nxt.y<=m&&vis[nxt.x][nxt.y]==0&&a[nxt.x][nxt.y]!='#'){
vis[nxt.x][nxt.y]=1;
if(a[nxt.x][nxt.y]=='='){
cout<<nxt.t<<endl;
return 0;
}
else if(a[nxt.x][nxt.y]>='A'&&a[nxt.x][nxt.y]<='Z'){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==a[nxt.x][nxt.y]&&i!=nxt.x&&j!=nxt.y){
nxt.x=i;
nxt.y=j;
q.push(nxt);
flag=1;
break;
}
}
if(flag){
break;
}
}
}
if(flag==0){
q.push(nxt);
}
flag=0;
}
}
}
return 0;
}