#include <bits/stdc++.h>
using namespace std;
int n, m;
int jia[5][3] = {{0, 0, 0}, {0, 1, 0}, {0, 0, 1}, {0, -1, 0}, {0, 0, -1}};
struct wz {
int a, b;
int s;
} c, q;
string nn[305];
int m2[305][305] = {};
void fd(wz &wy) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (nn[i][j] == nn[wy.a][wy.b] && (i != wy.a || j != wy.b)) {
wy.a = i;
wy.b = j;
return;
}
}
}
}
void dd() {
queue<wz> mm;
mm.push(q);
wz ne, wy;
while (!mm.empty()) {
wy = mm.front();
mm.pop();
if (nn[wy.a][wy.b] == '=') {
cout << wy.s;
return;
}
if (nn[wy.a][wy.b] >= 'A' && nn[wy.a][wy.b] <= 'Z') {
fd(wy);
}
m2[wy.a][wy.b] = 1;
for (int i = 1; i <= 4; i++) {
int x = wy.a + jia[i][1];
int y = wy.b + jia[i][2];
if (!m2[x][y] && x >= 0 && x < n && y >= 0 && y < m && nn[x][y] != '#') {
ne.a = x;
ne.b = y;
ne.s = wy.s + 1;
mm.push(ne);
m2[x][y] = 1;
}
}
}
cout << -1;
}
int main() {
cin >> n >> m;
c.a = c.b = q.a = q.b = -1;
c.s = q.s = 0;
for (int i = 0; i < n; i++) {
cin >> nn[i];
if (c.a < 0 && nn[i].find("=") != string::npos) {
c.a = i;
c.b = nn[i].find("=");
}
if (q.a < 0 && nn[i].find("@") != string::npos) {
q.a = i;
q.b = nn[i].find("@");
}
}
dd();
return 0;
}