#include<bits/stdc++.h>
using namespace std;
char f[500][500];
int vis[500][500];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int m,n,Ax,Ay,Bx,By,cx,cy;
struct node
{
int x,y,step;
node(){}
node(int x,int y,int step):x(x),y(y),step(step){}
};
int check(int x,int y)
{
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
if (i!=x&&j!=y&&f[i][j]==f[x][y])
{
cx=i;
cy=j;
}
}
}
}
void bfs()
{
queue<node> Q;
Q.push(node(Ax,Ay,0));
vis[Ax][Ay]=1;
while (!Q.empty())
{
node s=Q.front();
Q.pop();
if (f[s.x][s.y]=='=')
{
cout<<s.step;
return ;
}
if (f[s.x][s.y]>='A'&&f[s.x][s.y]<='Z')
{
check(s.x,s.y);
s.x=cx,s.y=cy;
}
for (int i=0;i<4;i++)
{
int xx=s.x+dx[i],yy=s.y+dy[i];
if (f[xx][yy]!='#'&&!vis[xx][yy]&&xx>=1&&xx<=n&&yy>=1&&yy<=m)
{
vis[xx][yy]=1;
Q.push(node(xx,yy,s.step+1));
}
}
}
}
int main()
{
cin>>n>>m;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
cin>>f[i][j];
if (f[i][j]=='@') {Ax=i,Ay=j;}
}
}
bfs();
}