#include<bits/stdc++.h>
using namespace std;
struct node {
int x,y,s;
};
int n,m;
string mp[301];
bool v[301][301];
int x,y;
int fx[4][2]= {1,0,-1,0,0,-1,0,1};
int bfs(int x,int y) {
queue<node>q;
q.push({x,y,0});
node a,b;
v[x][y]=1;
a.s=0,b.s=0;
while(q.size()!=0) {
a=q.front();
q.pop();
if(mp[a.x][a.y]=='=') {
return a.s;
}
for(int i=0; i<4; i++) {
bool flag=0;
b.x=a.x+fx[i][0];
b.y=a.y+fx[i][1];
if(b.x<0||b.y<0||b.x>=n||b.y>=m||mp[b.x][b.y]=='#'||v[b.x][b.y]==1) {
continue;
}
if(mp[b.x][b.y]>='A'&&mp[b.x][b.y]<='Z') {
for(int j=0; j<n; j++) {
for(int k=0; k<m; k++) {
if(mp[j][k]==mp[b.x][b.y]&&(j!=b.x&&k!=b.y)) {
q.push({j,k,a.s+1});
flag=1;
}
}
}
}
if(flag==0) {
v[b.x][b.y]=1;
b.s=a.s+1;
q.push(b);
}
}
}
}
int main() {
cin>>n>>m;
for(int i=0; i<n; i++) {
cin>>mp[i];
}
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
if(mp[i][j]=='@') {
cout<<bfs(i,j);
return 0;
}
}
}
return 0;
}