#include <bits/stdc++.h>
using namespace std;
int dp[225][1 << 16];
int dx[4] = {0, -1, 0, 1};
int dy[4] = {1, 0, -1, 0};
int tran[4] = {2, 3, 0, 1};
string s[15];
bool visit[15][15][1 << 16];
int n, m, length, backx, backy, startbody, status;
struct snake {
  int x, y, body;
} start;
bool in(int x, int y) { return (x >= 0 && x < n && y >= 0 && y < m); }
bool collision(int x, int y, snake sn) {
  int body = sn.body;
  int xx = sn.x;
  int yy = sn.y;
  for (int i = 1; i < length - 1; i++) {
    xx += dx[tran[body & 3]];
    yy += dy[tran[body & 3]];
    body >>= 2;
    if (x == xx && y == yy) return true;
  }
  return false;
}
int BFS() {
  queue<pair<snake, int>> Q;
  Q.push({start, 0});
  visit[start.x][start.y][start.body] = 1;
  while (!Q.empty()) {
    snake nowsnake = Q.front().first;
    int nowstep = Q.front().second;
    if (s[nowsnake.x][nowsnake.y] == '@') return nowstep;
    Q.pop();
    for (int i = 0; i < 4; i++) {
      int nextx = nowsnake.x + dx[i];
      int nexty = nowsnake.y + dy[i];
      if (in(nextx, nexty) && s[nextx][nexty] != '#' &&
          !collision(nextx, nexty, nowsnake)) {
        snake nextsnake;
        nextsnake.x = nextx;
        nextsnake.y = nexty;
        nextsnake.body = ((nowsnake.body << 2) & startbody) | i;
        if (!visit[nextsnake.x][nextsnake.y][nextsnake.body]) {
          visit[nextsnake.x][nextsnake.y][nextsnake.body] = true;
          Q.push({nextsnake, nowstep + 1});
        }
      }
    }
  }
  return -1;
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) cin >> s[i];
  length = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (s[i][j] != '#' && s[i][j] != '@' && s[i][j] != '.') {
        if (s[i][j] == '1') {
          start.x = i;
          start.y = j;
        }
        if (s[i][j] - '0' > length) {
          backx = i;
          backy = j;
          length = s[i][j] - '0';
        }
      }
    }
  }
  startbody = (1 << ((length - 1) * 2)) - 1;
  status = 0;
  while (s[backx][backy] != '1') {
    for (int i = 0; i < 4; i++) {
      int newbackx = backx + dx[i];
      int newbacky = backy + dy[i];
      if (in(newbackx, newbacky) &&
          s[newbackx][newbacky] + 1 == s[backx][backy]) {
        status <<= 2;
        status |= i;
        backx = newbackx;
        backy = newbacky;
        break;
      }
    }
  }
  start.body = status;
  cout << BFS() << endl;
}
