#include <bits/stdc++.h>
using namespace std;
const int dirx[4] = {1, 0, -1, 0};
const int diry[4] = {0, 1, 0, -1};
int f[16][16][1 << 16];
bool Used[16][16];
int rev[4];
int px[10], py[10];
int S[10][10], (*s)[10] = &S[5];
char c[16][16];
struct Queue {
  pair<pair<short int, short int>, int> f[5000000];
  int l, r;
  Queue() {
    l = 1;
    r = 0;
  }
  inline void pop() {
    ++l;
    if (l > r) l = 1, r = 0;
  }
  inline int size() { return r - l + 1; }
  inline void push(const pair<pair<int, int>, int>& p) { f[++r] = p; }
  inline pair<pair<short int, short int>, int>& front() { return f[l]; }
} Q;
int P[20];
bool found;
int N, M, Max, ApplepiX, ApplepiY, Ans = 1000002012;
inline void travel(int x, int y) {
  if (c[x][y] == '1') {
    found = 1;
    return;
  }
  Used[x][y] = 1;
  for (int i = 0; i < 4; ++i) {
    int _x = x + dirx[i], _y = y + diry[i];
    if (_x >= 1 && _y >= 1 && _x <= N && _y <= M && c[_x][_y] != '#' &&
        !Used[_x][_y])
      travel(_x, _y);
    if (found) return;
  }
}
int main() {
  scanf("%d%d ", &N, &M);
  rev[0] = 2;
  rev[2] = 0;
  rev[1] = 3;
  rev[3] = 1;
  s[1][0] = 0;
  s[0][1] = 1;
  s[-1][0] = 2;
  s[0][-1] = 3;
  P[1] = 1;
  for (int i = 2; i <= 8; ++i) P[i] = P[i - 1] << 2;
  for (int i = 1; i <= N; ++i) {
    gets(c[i] + 1);
    for (int j = 1; j <= M; ++j)
      if (c[i][j] >= '1' && c[i][j] <= '9')
        px[c[i][j] - '0'] = i, py[c[i][j] - '0'] = j,
                     Max = max(Max, c[i][j] - '0');
      else if (c[i][j] == '@')
        ApplepiX = i, ApplepiY = j;
  }
  travel(ApplepiX, ApplepiY);
  if (!found) {
    puts("-1");
    return 0;
  } else
    found = 0;
  int st = 0;
  --Max;
  for (int i = 2; i <= Max; ++i)
    st = (st << 2) + s[px[i] - px[i - 1]][py[i] - py[i - 1]];
  --Max;
  for (int i = 1; i <= N; ++i)
    for (int j = 1; j <= M; ++j)
      for (int k = 0; k < P[Max + 1]; ++k) f[i][j][k] = 1000002012;
  f[px[1]][py[1]][st] = 0;
  Q.push(make_pair(make_pair(px[1], py[1]), st));
  while (Q.size()) {
    int NowX = Q.front().first.first, NowY = Q.front().first.second,
        NowST = Q.front().second;
    Q.pop();
    for (int i = 0; i < 4; ++i) {
      int x = NowX + dirx[i], y = NowY + diry[i];
      int Tx = NowX, Ty = NowY;
      if (x > 0 && y > 0 && x <= N && y <= M) {
        if (c[x][y] == '#') continue;
        bool flag = 1;
        for (int k = Max; k >= 1; --k) {
          Tx += dirx[(NowST >> ((k - 1) << 1)) & 3];
          Ty += diry[(NowST >> ((k - 1) << 1)) & 3];
          if (Tx == x && y == Ty) {
            flag = 0;
            break;
          }
        }
        if (flag && f[x][y][(NowST >> 2) + rev[i] * P[Max]] == 1000002012) {
          f[x][y][(NowST >> 2) + rev[i] * P[Max]] =
              min(f[x][y][(NowST >> 2) + rev[i] * P[Max]],
                  f[NowX][NowY][NowST] + 1);
          if (x == ApplepiX && y == ApplepiY) {
            found = 1;
          }
          Q.push(make_pair(make_pair(x, y), (NowST >> 2) + rev[i] * P[Max]));
        }
        if (found) break;
      }
      if (found) break;
    }
    if (found) break;
  }
  for (int i = 0; i < P[Max + 1]; ++i) {
    Ans = min(Ans, f[ApplepiX][ApplepiY][i]);
  }
  if (Ans == 1000002012)
    puts("-1");
  else
    printf("%d\n", Ans);
  return 0;
}
