#include <bits/stdc++.h>
using namespace std;
char mp[310][310];
bool vis[310][310];
int dirx[]={0,1,0,-1};
int diry[]={1,0,-1,0};
struct AXI{
int x,y;
}ax;
int n,m;
queue<AXI> qu;
bool judge(int x,int y){
if(x<1||y<1||x>n||y>m){
return false;
}else if(vis[x][y]||mp[x][y]=='#'){
return false;
}else{
return true;
}
}
void BFS(){
int step=0;
while(!qu.empty()){
int len=qu.size();
while(len--){
if(mp[qu.front().x][qu.front().y]=='='){
cout<<step;
return ;
}
if(mp[qu.front().x][qu.front().y]>='A'&&mp[qu.front().x][qu.front().y]<='Z'){
vis[qu.front().x][qu.front().y]=true;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mp[i][j]==mp[qu.front().x][qu.front().y]&&!vis[i][j]){
qu.front().x=i;
qu.front().y=j;
}
}
}
}
for(int i=0;i<4;i++){
int tx=qu.front().x+dirx[i];
int ty=qu.front().y+diry[i];
if(judge(tx,ty)){
vis[tx][ty]=true;
ax.x=tx;
ax.y=ty;
qu.push(ax);
}
}
qu.pop();
}
step++;
}
}
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mp[i][j]=='@'){
vis[i][j]=true;
ax.x=i;
ax.y=j;
qu.push(ax);
break;
}
}
}
BFS();
return 0;
}