#include<bits/stdc++.h>
using namespace std;
int n,m;
char e;
int mg[400][400],f[400][400];
struct dl{
int x,y;
}nw,nxt;
queue<dl> q;
int dx[5]={0,0,0,1,-1};
int dy[5]={0,1,-1,0,0};
int main(){
scanf("%d%d",&n,&m);
memset(f,-1,sizeof(f));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf(" %c",&e);
if(e=='#') mg[i][j]=1;
else if(e=='=') mg[i][j]=-1;
else if(e=='.') mg[i][j]=0;
else if(e=='@'){
f[i][j]=0;
nw.x=i;
nw.y=j;
q.push(nw);
}
else{
mg[i][j]=e-'A'+10;
}
}
}
while(!q.empty()){
nw=q.front();
q.pop();
for(int i=1;i<=4;i++){
int xx=nw.x+dx[i],yy=nw.y+dy[i];
if(mg[xx][yy]>=10&&mg[nw.x][nw.y]<10){
f[xx][yy]=-1;
}
if(xx>0&&yy>0&&xx<=n&&yy<=m&&mg[xx][yy]!=1&&f[xx][yy]==-1){
if(mg[xx][yy]<10) f[xx][yy]=f[nw.x][nw.y]+1;
if(mg[xx][yy]==0){
nxt.x=xx;
nxt.y=yy;
}
else if(mg[xx][yy]==-1){
printf("%d",f[xx][yy]);
return 0;
}
else if(mg[xx][yy]>=10){
int ff=0;
for(int l=1;l<=n;l++){
for(int ll=1;ll<=m;ll++){
if(mg[l][ll]==mg[xx][yy]&&(yy!=ll||xx!=l)){
ff=1;
nxt.x=l;
nxt.y=ll;
f[l][ll]=f[xx][yy]=f[nw.x][nw.y]+1;
}
}
}
if(ff==0){
nxt.x=xx;
nxt.y=yy;
}
}
q.push(nxt);
}
}
}
return 0;
}