#include<bits/stdc++.h>
using namespace std;
int mapp[500][500];
bool v[500][500];
int n,m,sx,sy;
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
struct field
{
int x;
int y;
int step;
}f;
struct field move(int xx,int yy,int zz)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if((mapp[xx][yy]==mapp[i][j])&&(xx!=i&&yy!=j))
{
struct field ss;
ss.x=i;
ss.y=j;
ss.step=zz;
return ss;
}
}
}
}
void bfs()
{
queue<struct field >q;
struct field s;
s.x=sx;
s.y=sy;
s.step=0;
v[sx][sy]=1;
q.push(s);
while(!q.empty())
{
struct field s0;
s0=q.front();
q.pop();
if(mapp[s0.x][s0.y]>='A'&&mapp[s0.x][s0.y]<='Z')
{
s0=move(s0.x,s0.y,s0.step);
}
for(int i=0;i<4;i++)
{
int xx,yy;//!
xx=s0.x+dir[i][0];
yy=s0.y+dir[i][1];
if(!(xx>=1&&xx<=n&&yy>=1&&yy<=m))continue;
struct field s1;
s1.x=xx;
s1.y=yy;
s1.step=s0.step+1;
if(mapp[xx][yy]==2)
{
cout<<s1.step;
return;
}
if(mapp[xx][yy]&&(!v[xx][yy]))
{
v[xx][yy]=1;
q.push(s1);
}
}
}
}
int main()
{
char s;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>s;
if(s=='.')mapp[i][j]=1;
if(s>='A'&&s<='Z')mapp[i][j]=s;
if(s=='@')
{
sx=i;
sy=j;
mapp[i][j]=1;
}
if(s=='=')mapp[i][j]=2;
}
}
bfs();
return 0;
}