#include<bits/stdc++.h>
using namespace std;
int n,m,fx,fy;
char a[305][305];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int ax[26],ay[26],bx[26],by[26];
struct node{
int x,y;
int ans;
};
int main(){
queue<node>p;
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]=='@'){
fx=i;
fy=j;
}
if(a[i][j]>='A'&&a[i][j]<='Z'){
if(ax[a[i][j]-'A']==0&&ay[a[i][j]-'A']==0)
ax[a[i][j]-'A']=i,ay[a[i][j]-'A']=j;
else bx[a[i][j]-'A']=i,by[a[i][j]-'A']=j;
}
}
}
node F={fx,fy,0};
p.push(F);
while(!p.empty()){
node N=p.front();
p.pop();
for(int i=0;i<4;i++){
int sx=N.x+dx[i];
int sy=N.y+dy[i];
if(a[sx][sy]=='='){
N.ans++;
cout<<N.ans;
break;
}
else if(a[sx][sy]=='.'){
N.ans++;
node E={sx,sy,N.ans};
p.push(E);
a[sx][sy]='#';
}
else if(a[sx][sy]>='A'&&a[sx][sy]<='Z'){
N.ans++;
if(ax[a[sx][sy]-'A']==sx&&ay[a[sx][sy]-'A']==sy){
node E={bx[a[sx][sy]-'A'],by[a[sx][sy]-'A'],N.ans};
p.push(E);
a[sx][sy]='#';
}
else if(bx[a[sx][sy]-'A']==sx&&by[a[sx][sy]-'A']==sy){
node E={ax[a[sx][sy]-'A'],ay[a[sx][sy]-'A'],N.ans};
p.push(E);
a[sx][sy]='#';
}
}
}
}
return 0;
}