#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N = 310;
char g[N][N];
int dist[N][N];
bool vis[N][N];
typedef pair<int,int> PII;
int ansx,ansy,bx,by;
#define x first
#define y second
queue <PII> q;
int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};
int bfs(int x1,int y1)
{
memset(dist,-1,sizeof dist);
memset(vis,false,sizeof vis);
q.push({x1,y1});
dist[x1][y1] = 0;
vis[x1][y1] = true;
while(!q.empty())
{
PII t = q.front();
q.pop();
for(int i=0;i<4;i++)
{
int a = t.x + dx[i];
int b = t.y + dy[i];
if(g[a][b] == '#')continue;
if(vis[a][b] == true)continue;
if(a>n||a<1||b<1||b>m)continue;
vis[a][b] = true;
dist[a][b] = dist[t.x][t.y] + 1;
if(g[a][b] == '=')return dist[a][b];
else if(g[a][b] >= 'A'&&g[a][b] <= 'Z')
{
for(int i1=1;i1<=n;i1++)
for(int j=1;j<=m;j++)
{
if(g[i1][j] == g[a][b] && (i1!=a||j!=b))
{
dist[i1][j] = dist[a][b];
q.push({i1,j});
}
}
}
else q.push({a,b});
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>g[i][j];
if(g[i][j] == '@'){bx = i;by = j;}
if(g[i][j] == '='){ansx = i;ansy = j;}
}
int res = bfs(bx,by);
cout<<res<<endl;
return 0;
}