#include <bits/stdc++.h>
using namespace std;
const int M = 16 * 16 << 16, dr[] = {-1, 0, 1, 0}, dc[] = {0, 1, 0, -1};
char z[M], g[32][32];
int n, m, q[M], a[32], b[32], c, Z, e[32][32], f;
int pac() {
  int s = 0;
  for (int i = c; i > 0; --i) {
    int d = 0;
    while (a[i] != a[i - 1] + dr[d] || b[i] != b[i - 1] + dc[d]) ++d;
    s = (s << 2) + d;
  }
  s = (s << 8) + (b[0] << 4) + a[0];
  return s;
}
void unp(int s) {
  a[0] = s & 15, s >>= 4, b[0] = s & 15, s >>= 4, ++f;
  for (int i = 0, d; i < c; ++i, s >>= 2)
    e[a[i]][b[i]] = f, d = s & 3, a[i + 1] = a[i] + dr[d],
    b[i + 1] = b[i] + dc[d];
}
int bfs() {
  int h = 0, t = 0;
  z[q[t++] = pac()] = 1;
  for (int j = 1; h < t; ++j) {
    int t1 = t;
    while (h < t1) {
      int s = q[h++];
      unp(s);
      for (int d = 0; d < 4; ++d) {
        int x = a[0] + dr[d], y = b[0] + dc[d];
        if ('@' == g[x][y]) return j;
        if ('.' == g[x][y] && e[x][y] != f) {
          int s1 = (x + (y << 4) + (((d + 2) & 3) << 8) + ((s >> 8) << 10)) & Z;
          if (!z[s1]) z[q[t++] = s1] = 1;
        }
      }
    }
  }
  return -1;
}
int main() {
  ios_base::sync_with_stdio(0);
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) scanf("%s", g[i] + 1);
  for (int i = 1; i <= n; ++i)
    for (int j = 1, k; j <= m; ++j)
      if (g[i][j] > '0' && g[i][j] <= '9') {
        a[k = g[i][j] - '1'] = i, b[k] = j, g[i][j] = '.';
        if (k > c) c = k;
      }
  Z = (1 << (c * 2 + 8)) - 1;
  printf("%d\n", bfs());
  return 0;
}
