#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
struct node
{
int x,y,t;
};
char a[310][310];
int vis[310][310],n,m;
queue<node> q;
void same(int &dx,int &dy)
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(a[i][j]==a[dx][dy]&&i!=dx&&j!=dy)
{dx=i;dy=j;return;}
}
}
}
int main()
{
int x,y,dx,dy,i,j;
cin>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
cin>>a[i][j];
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(a[i][j]=='#')
vis[i][j]=1;
if(a[i][j]=='@')
{x=i;y=j;}
}
}
q.push((node){x,y,0});
vis[x][y]=1;
int xx[4]={1,-1,0,0},
yy[4]={0,0,1,-1};
while(!q.empty())
{
for(i=0;i<4;i++)
{
dx=xx[i]+q.front().x;
dy=yy[i]+q.front().y;
if(dx>=1&&dx<=n&&dy>=1&&dy<=m&&!vis[dx][dy])
{
if(a[dx][dy]<='Z'&&a[dx][dy]>='A')
{ vis[dx][dy]=1;
same(dx,dy);
q.push((node){dx,dy,q.front().t+1});
vis[dx][dy]=1;
}
else
{
q.push((node){dx,dy,q.front().t+1});
vis[dx][dy]=1;
}
}
}
if(a[q.front().x][q.front().y]=='=')
{ cout<<q.front().t;
return 0;
}
q.pop();
}
return 0;
}