#include <bits/stdc++.h>
const int maxxltop = 2000000;
const int maxm = 15;
const int maxn = 15;
const int maxnum = 65536;
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, -1, 0, 1};
struct Txl {
  int x, y;
  int num;
  int step;
} xl[maxxltop + 1];
bool done[maxm + 1][maxn + 1][maxnum + 1];
char map[maxm + 2][maxn + 2];
int m, n, K, sx, sy;
bool success;
int calcdir(int x, int y) {
  int i;
  for (i = 0; i < 4; ++i)
    if ((x == dx[i]) && (y == dy[i])) return i;
}
void init() {
  int i, j, k, x, y, nx, ny, oldx, oldy;
  int num;
  scanf("%d%d", &m, &n);
  K = 0;
  for (i = 1; i <= m; ++i) {
    scanf("%s", map[i] + 1);
    for (j = 1; j <= n; ++j) {
      if ((map[i][j] >= '0') && (map[i][j] <= '9'))
        if (map[i][j] - '0' > K) K = map[i][j] - '0';
      if (map[i][j] == '1') {
        sx = i;
        sy = j;
      }
    }
  }
  for (i = 1; i <= m; ++i)
    for (j = 1; j <= n; ++j)
      for (k = 0; k < (1 << ((K - 1) * 2)); ++k) done[i][j][k] = false;
  oldx = sx;
  oldy = sy;
  num = 0;
  for (i = 2; i <= K; ++i) {
    nx = 0;
    for (x = 1; x <= m; ++x) {
      if (nx) break;
      for (y = 1; y <= n; ++y)
        if (map[x][y] == '0' + i) {
          nx = x;
          ny = y;
          break;
        }
    }
    num += (calcdir(nx - oldx, ny - oldy) << (2 * (i - 2)));
    oldx = nx;
    oldy = ny;
  }
  xl[1].x = sx;
  xl[1].y = sy;
  xl[1].num = num;
  xl[1].step = 0;
  done[sx][sy][num] = true;
}
void work() {
  int i, j, k, x, y;
  int num;
  int pos[10][2];
  int head, tail;
  head = 0;
  tail = 1;
  success = false;
  while (head < tail) {
    ++head;
    pos[1][0] = xl[head].x;
    pos[1][1] = xl[head].y;
    num = xl[head].num;
    for (i = 2; i <= K; ++i) {
      j = (num & 3);
      pos[i][0] = pos[i - 1][0] + dx[j];
      pos[i][1] = pos[i - 1][1] + dy[j];
      num = (num >> 2);
    }
    for (j = 0; j < 4; ++j) {
      x = pos[1][0] + dx[j];
      y = pos[1][1] + dy[j];
      if ((x >= 1) && (x <= m) && (y >= 1) && (y <= n))
        if (map[x][y] != '#') {
          for (k = 1; k < K; ++k)
            if ((x == pos[k][0]) && (y == pos[k][1])) break;
          if (k < K) {
          } else {
            pos[0][0] = x;
            pos[0][1] = y;
            num = 0;
            for (k = 1; k <= K - 1; ++k)
              num +=
                  (calcdir(pos[k][0] - pos[k - 1][0], pos[k][1] - pos[k - 1][1])
                   << (2 * (k - 1)));
            if (!done[x][y][num]) {
              done[x][y][num] = true;
              xl[++tail].x = x;
              xl[tail].y = y;
              xl[tail].step = xl[head].step + 1;
              xl[tail].num = num;
              if (map[x][y] == '@') {
                success = true;
                printf("%d\n", xl[tail].step);
                return;
              }
            }
          }
        }
    }
  }
}
void output() {
  if (!success) printf("-1\n");
}
int main() {
  init();
  work();
  output();
  return 0;
}
