#include <bits/stdc++.h>
using namespace std;
int op, cp;
int con[20][20][75537], Map[20][20], X[4] = {-1, 0, 0, 1}, Y[4] = {0, 1, -1, 0};
int n, m, sx, sy, length, ex, ey;
char temp[20];
struct nd {
  int x, y, c, s;
};
int main() {
  bool find;
  int i, j, k, x, y, c, s, tc;
  queue<nd> now;
  stack<int> useless;
  while (scanf("%d%d", &n, &m) != EOF) {
    while (!now.empty()) now.pop();
    while (!useless.empty()) useless.pop();
    for (i = 1; i <= 15; i++)
      for (j = 1; j <= 15; j++)
        for (k = 1; k <= 65536; k++) con[i][j][k] = 0;
    for (i = 0; i <= n + 1; i++) Map[i][0] = Map[i][m + 1] = 1;
    for (i = 0; i <= m + 1; i++) Map[0][i] = Map[n + 1][i] = 1;
    for (i = 1; i <= n; i++) {
      scanf("%s", temp);
      for (j = 0; j < m; j++) {
        if (temp[j] == '.') Map[i][j + 1] = 0;
        if (temp[j] == '#') Map[i][j + 1] = 1;
        if (temp[j] == '1') {
          sx = i, sy = j + 1;
        }
        if (temp[j] >= '1' && temp[j] <= '9') Map[i][j + 1] = temp[j] - '0';
        if (temp[j] == '@') {
          ex = i, ey = j + 1;
        }
      }
    }
    length = 1;
    nd t;
    t.x = sx, t.y = sy, t.s = 0, t.c = 0, cp = 1;
    Map[sx][sy] = 0;
    while (true) {
      find = false;
      for (i = 0; i < 4; i++) {
        x = sx + X[i];
        y = sy + Y[i];
        if (Map[x][y] == 1 + length) {
          Map[x][y] = 0;
          length++;
          cp <<= 2;
          useless.push(i);
          sx = x, sy = y;
          find = true;
          break;
        }
      }
      if (!find) break;
    }
    cp >>= 2;
    while (!useless.empty()) {
      t.c <<= 2;
      t.c += useless.top();
      useless.pop();
    }
    op = 0;
    for (i = 1; i < length * 2; i++) op = (op << 1) + 1;
    find = false;
    now.push(t);
    while (!now.empty()) {
      t = now.front();
      x = t.x, y = t.y, s = t.s, c = t.c;
      now.pop();
      if (x == ex && y == ey) {
        find = true;
        break;
      }
      int tx, ty, tc;
      tx = x, ty = y, tc = c;
      Map[tx][ty] = 1;
      for (i = 2; i < length; i++) {
        tx += X[tc & 3];
        ty += Y[tc & 3];
        tc >>= 2;
        Map[tx][ty] = i;
      }
      for (i = 0; i < 4; i++) {
        t.c = ((c << 2) + i ^ 3) & op;
        t.x = x + X[i];
        t.y = y + Y[i];
        if (Map[t.x][t.y] == 0 && con[t.x][t.y][t.c] == 0) {
          t.s = s + 1;
          now.push(t);
          con[t.x][t.y][t.c] = t.s;
        }
      }
      tx = x, ty = y, tc = c;
      Map[tx][ty] = 0;
      for (i = 2; i < length; i++) {
        tx += X[tc & 3];
        ty += Y[tc & 3];
        tc >>= 2;
        Map[tx][ty] = 0;
      }
    }
    if (find)
      printf("%d\n", s);
    else
      printf("-1\n");
  }
}
