#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using i2 = pair<int, int>;
using vi = vector<int>;
const int DX[] = {-1, 0, 1, 0};
const int DY[] = {0, 1, 0, -1};
bool M[17][17], vis[17][17][1 << 16];
int D[17][17][1 << 16];
i2 snake[10];
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  int k = 0, ax = 0, ay = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      char c;
      cin >> c;
      if (c == '#') {
        M[i][j] = true;
      } else if (c == '@') {
        ax = i;
        ay = j;
      } else if (c != '.') {
        int t = (int)c - 48;
        snake[t] = {i, j};
        k = max(k, t);
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    M[i][0] = true;
    M[i][m + 1] = true;
  }
  for (int i = 1; i <= m; i++) {
    M[0][i] = true;
    M[n + 1][i] = true;
  }
  int mask = 0;
  for (int i = 2; i <= k; i++) {
    int dx = snake[i].first - snake[i - 1].first;
    int dy = snake[i].second - snake[i - 1].second;
    mask <<= 2;
    if (dx == 0 && dy == 1)
      mask++;
    else if (dx == 1 && dy == 0)
      mask += 2;
    else if (dx == 0 && dy == -1)
      mask += 3;
  }
  queue<pair<i2, int> > Q;
  Q.push({snake[1], mask});
  vis[snake[1].first][snake[1].second][mask] = true;
  bool ok = false;
  int res = 0;
  while (!Q.empty()) {
    pair<i2, int> u = Q.front();
    Q.pop();
    int ux = u.first.first, uy = u.first.second, umask = u.second;
    int sx = ux, sy = uy;
    for (int i = 2; i < k; i++) {
      int dir = ((umask >> (2 * (k - i))) & 3);
      sx += DX[dir];
      sy += DY[dir];
      M[sx][sy] = true;
    }
    if (ux == ax && uy == ay) {
      res = D[ux][uy][umask];
      ok = true;
      break;
    }
    for (int i = 0; i < 4; i++) {
      int vx = ux + DX[i];
      int vy = uy + DY[i];
      int vmask = ((umask >> 2) ^ (((i + 2) % 4) << (2 * (k - 2))));
      if (!M[vx][vy] && !vis[vx][vy][vmask]) {
        Q.push({{vx, vy}, vmask});
        vis[vx][vy][vmask] = true;
        D[vx][vy][vmask] = D[ux][uy][umask] + 1;
      }
    }
    sx = ux;
    sy = uy;
    for (int i = 2; i < k; i++) {
      int dir = ((umask >> (2 * (k - i))) & 3);
      sx += DX[dir];
      sy += DY[dir];
      M[sx][sy] = false;
    }
  }
  if (ok)
    cout << res;
  else
    cout << "-1";
  return 0;
}
