import java.util.LinkedList;
import java.util.Scanner;
class node{
int x,y,step;
char c;
boolean vis;
int x1=-1,y1=-1,x2=-1,y2=-1;
node(int x,int y,char c) {
this.x=x;
this.y=y;
this.c=c;
}
}
class mat{
int x1=-1,y1=-1,x2=-1,y2=-1;
}
public class Main {
static int N,M;
static int[] dx={-1,1,0,0},dy={0,0,-1,1};
static char[][] arr=new char[305][305];
static node[][] board=new node[305][305];
static mat[] mats =new mat[26];
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
N=sc.nextInt();
M=sc.nextInt();
int x=0,y=0;
for(int i=0;i<26;i++){
mats[i]=new mat();
}
for(int i=0;i<N;i++) {
arr[i]=sc.next().toCharArray();
for(int j=0;j<arr[i].length;j++) {
board[i][j]=new node(i,j,arr[i][j]);
if(arr[i][j]=='@') {
x=i;y=j;
}
if(arr[i][j]>='A'&&arr[i][j]<='Z') {
int q=arr[i][j]-'A';
if(mats[q].x1==-1) {
mats[q].x1=i;
mats[q].y1=j;
}else {
mats[q].x2=i;
mats[q].y2=j;
}
}
}
}
LinkedList<node> queue=new LinkedList<>();
board[x][y].vis=true;
queue.addLast(board[x][y]);
int res=0;
outerLoop:
while(!queue.isEmpty()) {
node p=queue.removeFirst();
for(int i=0;i<4;i++) {
int a=p.x+dx[i],b=p.y+dy[i];
if(a<0||b<0||a>=N||b>=M||arr[a][b]=='#'||board[a][b].vis) continue;
if(arr[a][b]=='=') {
res=p.step+1;
break outerLoop;
}
if(!(arr[a][b] != '.')){
board[a][b].vis=true;
board[a][b].step=p.step+1;
queue.addLast(board[a][b]);
}
if(arr[a][b]>='A'&&arr[a][b]<='Z') {
int k=arr[a][b]-'A';
if(a==mats[k].x1&&b==mats[k].y1) {
board[a][b].step=p.step+1;
board[mats[k].x2][mats[k].y2].step=p.step+1;
queue.addLast(board[mats[k].x2][mats[k].y2]);
}else{
board[a][b].step=p.step+1;
board[mats[k].x1][mats[k].y1].step=p.step+1;
queue.addLast(board[mats[k].x1][mats[k].y1]);
}
}
}
}
System.out.println(res);
}
}