#include <bits/stdc++.h>
using namespace std;
int dp[230][65536], n, m;
char s[20][20];
int vis[20][20];
int posx[12], posy[12];
int cx[4] = {-1, 0, 1, 0};
int cy[4] = {0, 1, 0, -1};
queue<pair<int, int> > q;
int call(int dx, int dy) {
  if (dx == 1 && dy == 0) {
    return 0;
  } else if (dx == -1 && dy == 0) {
    return 1;
  } else if (dx == 0 && dy == 1) {
    return 2;
  } else {
    return 3;
  }
}
int bfs() {
  int mx = 1;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (s[i][j] >= '1' && s[i][j] <= '9') {
        posx[s[i][j] - '0'] = i;
        posy[s[i][j] - '0'] = j;
        mx = max(mx, s[i][j] - '0');
      }
    }
  }
  int x = posx[1] * m + posy[1];
  int y = 0;
  for (int i = 2; i <= mx; i++) {
    int dx = posx[i] - posx[i - 1];
    int dy = posy[i] - posy[i - 1];
    y = y * 4 + call(dx, dy);
  }
  dp[x][y] = 1;
  q.push(make_pair(x, y));
  while (!q.empty()) {
    pair<int, int> f = q.front();
    q.pop();
    int x = f.first;
    int y = f.second;
    int tem = y;
    posx[1] = x / m;
    posy[1] = x % m;
    for (int i = mx; i >= 2; i--) {
      int res = tem % 4;
      tem /= 4;
      if (res == 0) {
        posx[i] = 1;
        posy[i] = 0;
      } else if (res == 1) {
        posx[i] = -1;
        posy[i] = 0;
      } else if (res == 2) {
        posx[i] = 0;
        posy[i] = 1;
      } else {
        posx[i] = 0;
        posy[i] = -1;
      }
    }
    for (int i = 2; i <= mx; i++) {
      posx[i] = posx[i - 1] + posx[i];
      posy[i] = posy[i - 1] + posy[i];
      vis[posx[i]][posy[i]] = 1;
    }
    for (int i = 0; i < 4; i++) {
      int nx = posx[1] + cx[i];
      int ny = posy[1] + cy[i];
      if (nx < 0 || nx >= n || ny < 0 || ny >= m || s[nx][ny] == '#' ||
          nx == posx[2] && ny == posy[2])
        continue;
      if (nx == posx[mx] && ny == posy[mx] || !vis[nx][ny]) {
        int xx = nx * m + ny;
        int yy = call(posx[1] - nx, posy[1] - ny);
        for (int j = 2; j < mx; j++) {
          int tx = posx[j] - posx[j - 1];
          int ty = posy[j] - posy[j - 1];
          yy = yy * 4 + call(tx, ty);
        }
        if (dp[xx][yy]) continue;
        dp[xx][yy] = dp[x][y] + 1;
        if (s[nx][ny] == '@') return dp[xx][yy] - 1;
        q.push(make_pair(xx, yy));
      }
    }
    for (int i = 2; i <= mx; i++) {
      vis[posx[i]][posy[i]] = 0;
    }
  }
  return -1;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) scanf("%s", s[i]);
  printf("%d\n", bfs());
  return 0;
}
