#include<bits/stdc++.h>
using namespace std;
struct Node {
int x, y, t;
};
char a[305][305];
bool vis[305][305];
string s;
int n,m,sx,sy;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
void change(int nx,int ny){
char c=a[nx][ny];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==c&&(i!=nx||j!=ny)){
nx=i;
ny=j;
return;
}
}
}
}
int bfs(){
queue<Node> q;
q.push({sx,sy,0});
vis[sx][sy]=true;
while(!q.empty()){
Node f=q.front();
q.pop();
if(a[f.x][f.y]=='='){
return f.t;
}
if(a[f.x][f.y]>='A'&&a[f.x][f.y]<='Z'){
int nx=f.x,ny=f.y;
change(nx,ny);
q.push({nx,ny,f.t});
continue;
}
for(int i=0;i<4;i++) {
int nx=f.x+dx[i];
int ny=f.y+dy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[nx][ny]!='#'&&!vis[nx][ny]){
vis[nx][ny]=true;
q.push({nx,ny,f.t+1});
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>s;
for(int j=1;j<=m;j++){
a[i][j]=s[j-1];
if(a[i][j]=='@'){
sx=i;
sy=j;
}
}
}
cout<<bfs()<<endl;
}