#include<iostream>
#include<queue>
#include<stdio.h>
using namespace std;
static int dx[4]={1,-1,0,0};
static int dy[4]={0,0,1,-1};
typedef struct {
int x,y;
long tm;
} index;
int n,m,cvy[30],ifp[400][400];
long ans=11451400;
char p[400][400];
index covy(int x,int y,char c,long ti)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(p[i][j]==c&&!(x==i&&y==j))
return (index){i,j,ti+1};
}
}
}
void bfs()
{
int x1,y1;
queue <index> q;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(p[i][j]=='@')
{
x1=i;
y1=j;
}
q.push((index){x1,y1,0});
ifp[x1][y1]=1;
while(q.size())
{
index t=q.front();
for(int i=0;i<4;i++)
{
int xx=t.x+dx[i],yy=t.y+dy[i];
if(xx<0||yy<0||xx>=n||yy>=m) continue;
if(p[xx][yy]=='=')
{
ans=t.tm+1;
return;
}
else if(p[xx][yy]=='.'&&!ifp[xx][yy])
{
q.push((index){xx,yy,t.tm+1});
ifp[xx][yy]=1;
}
else if(65<=p[xx][yy]&&p[xx][yy]<=90&&!ifp[xx][yy])
{
index tem=covy(xx,yy,p[xx][yy],t.tm);
if(cvy[p[xx][yy]-'A']==0)
{
q.push(tem);
cvy[p[xx][yy]-'A']=1;
}
else
{
int xt=tem.x,yt=tem.y;
q.push(tem);
ifp[xx][yy]=1;
ifp[xt][yt]=1;
}
}
}
q.pop();
}
}
int main(void)
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>p[i][j];
bfs();
cout<<ans;
}