#include<bits/stdc++.h>
using namespace std;
const int N=350;
struct node{
int x,y,step;
};
struct no{
int x1,y1,x2,y2;
}cs[30];
queue<node>q;
int n,m,f[4][2]={{1,0},{-1,0},{0,1},{0,-1}},qx,qy,ex,ey;
char a[N][N];
bool vis[N][N];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]>='A'&&a[i][j]<='Z')
{
if(cs[a[i][j]-'A'+1].x1==0&&cs[a[i][j]-'A'+1].y1==0)
{
cs[a[i][j]-'A'+1].x1=i,cs[a[i][j]-'A'+1].y1=j;
}
else
{
cs[a[i][j]-'A'+1].x2=i;
cs[a[i][j]-'A'+1].y2=j;
}
}
else if(a[i][j]=='@') qx=i,qy=j;
else if(a[i][j]=='=') ex=i,ey=j;
}
}
vis[qx][qy]=true;
q.push(node{qx,qy,0});
while(!q.empty())
{
node ha=q.front();
node t=ha;
q.pop();
if(a[ha.x][ha.y]=='=')
{
printf("%d",ha.step);
break;
}
if(a[ha.x][ha.y]>='A'&&a[ha.x][ha.y]<='Z')
{
if(cs[a[ha.x][ha.y]-'A'+1].x1==ha.x&&cs[a[ha.x][ha.y]-'A'+1].y1==ha.y)
{
ha.x=cs[a[t.x][t.y]-'A'+1].x2;
ha.y=cs[a[t.x][t.y]-'A'+1].y2;
}
else
{
ha.x=cs[a[t.x][t.y]-'A'+1].x1;
ha.y=cs[a[t.x][t.y]-'A'+1].y1;
}
}
for(int i=0;i<4;i++)
{
int tx=ha.x+f[i][0],ty=ha.y+f[i][1],ts=ha.step+1;
if(tx>=1&&ty>=1&&tx<n&&ty<m&&!vis[tx][ty]&&a[tx][ty]!='#')
{
q.push(node{tx,ty,ts});
vis[tx][ty]=true;
}
}
}
}