#include <bits/stdc++.h>
using namespace std;
struct Node {
  int x, y;
  int sta;
  Node(){};
  Node(int x, int y, int sta) : x(x), y(y), sta(sta){};
};
const int maxn = 20;
int n, m, k, MX;
int step[15][15][1 << 16];
char M[maxn][maxn];
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
bool isok(int sta) {
  int x = 0, y = 0;
  for (int i = 0; i < k - 1; i++) {
    int vec = ((sta >> (2 * i)) & 3);
    x -= dx[vec];
    y -= dy[vec];
    if (x == 0 && y == 0) return false;
  }
  return true;
}
void BFS(int x, int y, int sta) {
  queue<Node> Q;
  Q.push(Node(x, y, sta));
  memset(step, -1, sizeof(step));
  step[x][y][sta] = 0;
  while (!Q.empty()) {
    Node temp = Q.front();
    Q.pop();
    Node nxt;
    for (int i = 0; i < 4; i++) {
      nxt.x = temp.x + dx[i];
      nxt.y = temp.y + dy[i];
      nxt.sta = ((temp.sta << 2) & MX) | i;
      if (nxt.x >= 0 && nxt.x < n && nxt.y >= 0 && nxt.y < m &&
          M[nxt.x][nxt.y] != '#' && isok(nxt.sta) &&
          step[nxt.x][nxt.y][nxt.sta] == -1) {
        step[nxt.x][nxt.y][nxt.sta] = step[temp.x][temp.y][temp.sta] + 1;
        if (M[nxt.x][nxt.y] == '@') {
          cout << step[nxt.x][nxt.y][nxt.sta] << endl;
          return;
        }
        Q.push(nxt);
      }
    }
  }
  cout << -1 << endl;
  return;
}
int calc_sta(int x, int y) {
  int ans = 0;
  for (int i = 0; i < k - 1; i++) {
    for (int j = 0; j < 4; j++) {
      int n_x = x - dx[j];
      int n_y = y - dy[j];
      if (M[n_x][n_y] == M[x][y] + 1) {
        ans |= j << (2 * i);
        x = n_x;
        y = n_y;
        break;
      }
    }
  }
  return ans;
}
int main() {
  cin >> n >> m;
  int x, y, sta;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      cin >> M[i][j];
      if (M[i][j] >= '1' && M[i][j] <= '9') k = max(k, M[i][j] - '0');
      if (M[i][j] == '1') x = i, y = j;
    }
  MX = (1 << (2 * (k - 1))) - 1;
  sta = calc_sta(x, y);
  BFS(x, y, sta);
  return 0;
}
