#include <bits/stdc++.h>
using namespace std;
int n, m, lung, x[20], X[20], Y[20], used[17][17], xmar, ymar;
char A[17][17];
int di[] = {-1, 0, 1, 0};
int dj[] = {0, 1, 0, -1};
int op[] = {2, 3, 0, 1};
struct elem {
  char x, y;
  short int dist;
  int conf;
};
queue<elem> Q;
bitset<65539> viz[17][17];
inline void get_first() {
  int ic, jc;
  elem start;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      if (A[i][j] == '1') {
        start.x = i, start.y = j;
        lung = 1;
        ic = i, jc = j;
        int conf = 0;
        for (;; ++lung) {
          int found = 0;
          for (int d = 0; d < 4; ++d) {
            int iv = ic + di[d], jv = jc + dj[d];
            if (A[iv][jv] == lung + 1 + '0') {
              ic = iv, jc = jv;
              conf = conf * 4 + d;
              found = 1;
            }
          }
          if (!found) {
            break;
          }
        }
        start.conf = conf;
        start.dist = 0;
      }
    }
  }
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      if (A[i][j] == '@') {
        xmar = i, ymar = j;
      }
    }
  }
  viz[start.x][start.y][start.conf] = 1;
  Q.push(start);
}
inline void desc(int val, int *x) {
  x[0] = 0;
  for (int i = 1; i <= lung; ++i) {
    x[i] = val % 4;
    val /= 4;
  }
}
int main() {
  scanf("%d %d\n", &n, &m);
  for (int i = 1; i <= n; ++i) {
    scanf("%s", A[i] + 1);
  }
  get_first();
  int p = 1;
  for (int i = 1; i <= lung - 2; ++i) {
    p *= 4;
  }
  int ind = 1;
  while (!Q.empty()) {
    elem now = Q.front();
    Q.pop();
    desc(now.conf, x);
    int ic = now.x, jc = now.y;
    ++ind;
    for (int i = lung; i > 0; --i) {
      X[i] = ic, Y[i] = jc;
      used[X[i]][Y[i]] = ind;
      ic += di[x[i - 1]], jc += dj[x[i - 1]];
    }
    ic = now.x, jc = now.y;
    elem next;
    for (int d = 0; d < 4; ++d) {
      int iv = ic + di[d], jv = jc + dj[d];
      if (!(iv >= 1 && iv <= n && jv >= 1 && jv <= m && A[iv][jv] != '#'))
        continue;
      if (used[iv][jv] == ind && !(X[1] == iv && Y[1] == jv)) continue;
      next.x = iv, next.y = jv;
      next.dist = now.dist + 1;
      next.conf = now.conf / 4;
      next.conf += p * op[d];
      if (iv == xmar && jv == ymar) {
        printf("%d\n", next.dist);
        return 0;
      }
      if (!viz[next.x][next.y][next.conf]) {
        viz[next.x][next.y][next.conf] = 1;
        Q.push(next);
      }
    }
  }
  printf("%d\n", -1);
  return 0;
}
