#include<bits/stdc++.h>
using namespace std;
struct node{
short int x;
short int y;
int step=0;
};
int f[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int main()
{
int n,m;
scanf("%d%d",&n,&m);
char map[305][305];
short int judge[305][305]={{0}};
node p;
string s;
for(int i=0;i<n;i++)
{
cin>>s;
for(int j=0;j<m;j++)
{
map[i][j]=s[j];
if(map[i][j]=='@')
p.x=i,p.y=j,p.step=0;
}
}
queue <node> Q;
Q.push(p);
while(!Q.empty())
{
p=Q.front();
if(map[p.x][p.y]=='=')
{
printf("%d",p.step);
return 0;
}
if(map[p.x][p.y]<'A'||map[p.x][p.y]>'Z'||judge[p.x][p.y]>1)
map[p.x][p.y]='#';
else
judge[p.x][p.y]++;
Q.pop();
node temp;
for(int i=0;i<4;i++)
{
if(p.x+f[i][0]<n&&p.x+f[i][0]>=0&&p.y+f[i][1]<m&&p.y+f[i][1]>=0)
{
if(map[p.x+f[i][0]][p.y+f[i][1]]!='#')
{
if(map[p.x+f[i][0]][p.y+f[i][1]]>='A'&&map[p.x+f[i][0]][p.y+f[i][1]]<='Z')
{
bool flag=false,ifHave=false;
for(int k=0;k<n;k++)
{
for(int j=0;j<m;j++)
{
if(map[k][j]==map[p.x+f[i][0]][p.y+f[i][1]]&&(k!=p.x+f[i][0]||j!=p.y+f[i][1]))
{
temp.x=k,temp.y=j,ifHave=flag=true;
break;
}
if(flag)
break;
}
}
if(!ifHave)
{
temp.x=p.x+f[i][0];
temp.y=p.y+f[i][1];
}
}
else
{
temp.x=p.x+f[i][0];
temp.y=p.y+f[i][1];
}
temp.step=p.step+1;
Q.push(temp);
}
}
}
}
}