using namespace std;
struct node{
long long x,y,step;
}b[351][351];
queue<node> q;
long long i,j,n,m,f[351][351],cnt;
long long xf[5]={0,0,1,-1},yf[5]={1,-1,0,0};
char a[351][351];
void dfs(int xx,int yy)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]==a[xx][yy]&&i!=xx)
{
b[xx][yy].x=i,b[xx][yy].y=j;
b[i][j].x=xx,b[i][j].y=yy;
break;
}
}
int main()
{
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]=='@') q.push((node){i,j,0});
else if(a[i][j]>='A'&&a[i][j]<='Z') dfs(i,j);
}
while(!q.empty())
{
node p=q.front();
q.pop();
if(a[p.x][p.y]=='=')
{
cout<<p.step;
break;
}
if(!(a[p.x][p.y]>='A'&&a[p.x][p.y]<='Z')) f[p.x][p.y]=1;
for(int i=0;i<4;i++)
{
int xx=p.x+xf[i],yy=p.y+yf[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]!='#'&&f[xx][yy]==0)
{
f[xx][yy]=1;
if(a[xx][yy]>='A'&&a[xx][yy]<='Z')
q.push((node){b[xx][yy].x,b[xx][yy].y,p.step+1});
else q.push((node){xx,yy,p.step+1});
}
}
}
return 0;
}```