#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1 << 17;
struct node {
  int x, y, hs;
  node(int _x = 0, int _y = 0, int _hs = 0) { x = _x, y = _y, hs = _hs; }
} st, en;
struct snake {
  int x, y;
  snake(int _x = 0, int _y = 0) { x = _x, y = _y; }
  bool operator==(const snake &a) { return x == a.x && y == a.y; }
} sk[10];
char mp[16][16];
int vis[16][16][maxn], n, m, len;
int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
int _hash() {
  int ret = 0;
  for (int i = len; i > 1; i--) {
    for (int j = 0; j < 4; j++) {
      snake tmp = snake(sk[i - 1].x + dir[j][0], sk[i - 1].y + dir[j][1]);
      if (tmp == sk[i]) ret = ret << 2 | j;
    }
  }
  return ret;
}
bool judge(int x, int y, node now, int &hs) {
  if (mp[x][y] == '#' || x < 0 || x >= n || y < 0 || y >= m) return 0;
  int hx = x, hy = y;
  sk[1] = snake(x, y);
  sk[2] = snake(now.x, now.y);
  for (int i = 3; i <= len; i++) {
    int hd = now.hs & 3;
    int _x = sk[i - 1].x + dir[hd][0];
    int _y = sk[i - 1].y + dir[hd][1];
    if (_x == hx && _y == hy) return 0;
    sk[i].x = _x, sk[i].y = _y;
    now.hs >>= 2;
  }
  hs = _hash();
  return 1;
}
queue<node> q;
void bfs() {
  memset(vis, inf, sizeof(vis));
  while (!q.empty()) q.pop();
  st = node(sk[1].x, sk[1].y, _hash());
  vis[st.x][st.y][st.hs] = 0;
  q.push(st);
  while (!q.empty()) {
    st = q.front();
    q.pop();
    for (int i = 0; i < 4; i++) {
      int x = st.x + dir[i][0];
      int y = st.y + dir[i][1];
      int hs;
      if (!judge(x, y, st, hs)) continue;
      if (vis[x][y][hs] <= vis[st.x][st.y][st.hs] + 1) continue;
      vis[x][y][hs] = vis[st.x][st.y][st.hs] + 1;
      q.push(node(x, y, hs));
    }
  }
}
int main() {
  while (scanf("%d%d", &n, &m) != EOF) {
    len = 0;
    for (int i = 0; i < n; i++) {
      scanf("%s", mp[i]);
      for (int j = 0; j < m; j++) {
        if (mp[i][j] == '@') en = node(i, j, 0);
        if (mp[i][j] <= '9' && mp[i][j] >= '1') {
          sk[mp[i][j] - '0'] = snake(i, j);
          len = max(len, mp[i][j] - '0');
        }
      }
    }
    bfs();
    int ans = inf;
    for (int i = 0; i < maxn; i++) ans = min(vis[en.x][en.y][i], ans);
    if (ans == inf)
      puts("-1");
    else
      printf("%d\n", ans);
  }
  return 0;
}
