#include <bits/stdc++.h>
using namespace std;
char buf[16][16];
bool was[16][16][67777];
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
int len = 0;
int n, m;
int GetState(int hx, int hy, bool clean = false, int cur = 1) {
  if (cur == len - 1 && !clean || cur == len) {
    if (clean) {
      buf[hx][hy] = '.';
    }
    return 0;
  }
  for (int i = 0; i < 4; ++i) {
    if (hx + dx[i] >= 0 && hx + dx[i] < n && hy + dy[i] >= 0 &&
        hy + dy[i] < m && buf[hx + dx[i]][hy + dy[i]] == cur + 1 + '0') {
      if (clean) {
        buf[hx][hy] = '.';
      }
      return GetState(hx + dx[i], hy + dy[i], clean, cur + 1) * 4 + i;
    }
  }
  buf[hx][hy] = '.';
  return -1;
}
void DecodeState(int x, int y, int state, int cur = 1) {
  if (cur == len) {
    return;
  }
  buf[x][y] = cur + '0';
  x += dx[state & 3];
  y += dy[state & 3];
  state >>= 2;
  DecodeState(x, y, state, cur + 1);
}
struct Pos {
  int x, y, state, t;
};
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; ++i) {
    cin >> buf[i];
  }
  int hx = -1, hy = -1;
  int gx = -1, gy = -1;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      if (buf[i][j] == '1') {
        hx = i;
        hy = j;
      }
      if (buf[i][j] == '@') {
        gx = i;
        gy = j;
      }
      if (buf[i][j] >= '0' && buf[i][j] <= '9') {
        len = max(len, buf[i][j] - '0');
      }
    }
  }
  int state = GetState(hx, hy, true);
  Pos cur;
  cur.t = 0;
  cur.x = hx;
  cur.y = hy;
  cur.state = state;
  was[hx][hy][state] = true;
  queue<Pos> Q;
  Q.push(cur);
  while (!Q.empty()) {
    Pos tmp = Q.front();
    if (tmp.x == gx && tmp.y == gy) {
      cout << tmp.t << endl;
      return 0;
    }
    Q.pop();
    DecodeState(tmp.x, tmp.y, tmp.state);
    for (int i = 0; i < 4; ++i) {
      int nx = tmp.x + dx[i], ny = tmp.y + dy[i];
      if (nx < 0 || nx >= n || ny < 0 || ny >= m ||
          buf[nx][ny] >= '1' && buf[nx][ny] < '0' + len || buf[nx][ny] == '#') {
        continue;
      }
      buf[nx][ny] = '0';
      int state = GetState(nx, ny, false, 0);
      if (!was[nx][ny][state]) {
        Pos tec;
        tec.x = nx;
        tec.y = ny;
        tec.state = state;
        tec.t = tmp.t + 1;
        Q.push(tec);
        was[nx][ny][state] = true;
      }
      buf[nx][ny] = '.';
    }
    GetState(tmp.x, tmp.y, true);
  }
  cout << -1 << endl;
  return 0;
}
