#include <bits/stdc++.h>
const double EPS = 1e-9;
const int INT_INF = 0x7FFFFFF;
const long long I64_INF = 0x7FFFFFFFFFFFFFF;
const double PI = acos(-1.0);
using namespace std;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {-1, 0, 1, 0};
int d[15][15][(1 << 16) + 100];
int n, m, l;
char second[20][20];
int res = INT_INF;
bool on(int x, int y) { return (x >= 0 && x < n && y >= 0 && y < m); }
void put(int& mask, int pos, int val) {
  pos = (pos - 1) * 2;
  mask |= (val << pos);
}
int get(int mask, int pos) {
  pos = (pos - 1) * 2;
  return (mask & (3 << pos)) >> pos;
}
bool valid(int xx, int yy, int x, int y, int mask) {
  if (second[xx][yy] == '#') return 0;
  for (int i = 1; i < l - 1; i++) {
    x += dx[get(mask, i)];
    y += dy[get(mask, i)];
    if (xx == x && yy == y) return 0;
  }
  return 1;
}
queue<int> qx;
queue<int> qy;
queue<int> qmask;
void bfs() {
  while (!qx.empty()) {
    int x = qx.front();
    qx.pop();
    int y = qy.front();
    qy.pop();
    int mask = qmask.front();
    qmask.pop();
    if (second[x][y] == '@') res = min(res, d[x][y][mask]);
    for (int i = 0; i < (int)4; i++)
      if (on(x + dx[i], y + dy[i]) && valid(x + dx[i], y + dy[i], x, y, mask)) {
        int nmask = (mask << 2) & ((1 << 16) - 1);
        put(nmask, 1, (i + 2) & 3);
        if (d[x + dx[i]][y + dy[i]][nmask] > d[x][y][mask] + 1) {
          d[x + dx[i]][y + dy[i]][nmask] = d[x][y][mask] + 1;
          qx.push(x + dx[i]);
          qy.push(y + dy[i]);
          qmask.push(nmask);
        }
      }
  }
}
int main() {
  scanf("%d%d\n", &n, &m);
  memset(d, -1, sizeof d);
  for (int i = 0; i < (int)n; i++) gets(second[i]);
  int mask = 0, x, y;
  for (int i = 0; i < (int)n; i++)
    for (int j = 0; j < (int)m; j++)
      if (second[i][j] == '1') {
        x = i;
        y = j;
        l = 1;
        second[x][y] = '.';
        for (l = 1;; l++) {
          int c = 0;
          for (; c < 4; c++)
            if (on(x + dx[c], y + dy[c]) &&
                second[x + dx[c]][y + dy[c]] == '1' + l)
              break;
          if (c == 4) break;
          x += dx[c];
          y += dy[c];
          second[x][y] = '.';
          put(mask, l, c);
        }
        x = i;
        y = j;
      }
  qx.push(x);
  qy.push(y);
  qmask.push(mask);
  for (int i = 0; i < (int)n; i++)
    for (int j = 0; j < (int)m; j++)
      for (int k = 0; k < (int)(1 << 16); k++) d[i][j][k] = INT_INF;
  d[x][y][mask] = 0;
  bfs();
  if (res == INT_INF)
    puts("-1");
  else
    printf("%d\n", res);
  return 0;
}
