#include<iostream>
#include<queue>
using namespace std;
long long n,m,sx,sy,dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}},s[305][305];
char a[305][305];
struct point{
long long x,y,sum;
};
void zimu1(long long &xx,long long &yy){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==a[xx][yy]&&i!=xx&&j!=yy){
xx=i;
yy=j;
return ;
}
}
}
}
queue<point> v;
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j];
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]=='@') sx=i,sy=j;
//cout<<sx<<" "<<sy<<endl;
a[sx][sy]=0;
point k={sx,sy,0};
v.push(k);
while(!v.empty()){
point p=v.front();
long long x1=p.x,y1=p.y,t=p.sum;
v.pop();
if('A'<=a[x1][y1]&&a[x1][y1]<='Z') zimu1(x1,y1);
if(a[x1][y1]=='='){
cout<<t;
return 0;
}
for(int i=0;i<4;i++){
long long xx=x1+dir[i][0],yy=y1+dir[i][1];
if(xx>=1&&yy>=1&&xx<=n&&yy<=m&&a[xx][yy]!='#'&&s[xx][yy]==0){
s[xx][yy]=1;
//cout<<xx<<" "<<yy<<endl;
point k={xx,yy,t+1};
v.push(k);
}
}
}
return 0;
}
53求调