#include<iostream>
#include<queue>
using namespace std;int n,m;
char map1[305][305];int u,v;int l,t;
int ans=0;int vis[305][305]={0};
int maxn=999999;
int tx[4]={0,-1,1,0};
int ty[4]={1,0,0,-1};
struct node
{
int hang;
int line;
}temp1,temp2;
queue<node>q;
void dfs(int u1,int v1,int step)
{
for(int i=0;i<4;i++)
{
int xx=u1+tx[i];
int yy=v1+ty[i];
if(map1[xx][yy]=='#')continue;
if(xx<=0||yy<=0)continue;
else if(map1[xx][yy]=='.'&&vis[xx][yy]==0)
{
vis[xx][yy]=1;
dfs(xx,yy,step+1);
vis[xx][yy]==0;
}
else if(map1[xx][yy]>='A'&&map1[xx][yy]<='Z')
{
for(int j=0;j<q.size();j++)
{
temp2=q.front();
if(xx==temp2.hang&&yy==temp2.line)continue;
if(vis[xx][yy])continue;
else
{
vis[xx][yy]=1;
dfs(temp2.hang,temp2.line,step+1);
vis[xx][yy]=1;
}
}
}
else if(map1[xx][yy]=='=')
{
ans=min(maxn,step+1);return ;
}
else if(map1[xx][yy]=='@')continue;
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>map1[i][j];
if(map1[i][j]=='@')
{
u=i;
v=j;
}
if(map1[i][j]>='A'&&map1[i][j]<='Z')
{
temp1.hang=i;
temp1.line=j;
q.push(temp1);
}
}
}
dfs(u,v,0);
cout<<ans;
return 0;
}