#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
const int dx[] = {-1, 0, 0, 1};
const int dy[] = {0, -1, 1, 0};
int n, m;
char in[16][16];
vector<int> sx, sy;
int gx, gy, K;
int dp[15][15][1 << 16];
inline int encode(vector<int> px, vector<int> py) {
  int c = 0;
  for (int i = 0; i < K - 1; i++) {
    int dir;
    for (dir = 0; dir < 4; dir++) {
      if (px[i] + dx[dir] == px[i + 1] && py[i] + dy[dir] == py[i + 1]) {
        break;
      }
    }
    c |= dir << (2 * i);
  }
  return c;
}
inline void decode(int c, int x, int y, vector<int>& px, vector<int>& py) {
  px.resize(K);
  py.resize(K);
  px[0] = x, py[0] = y;
  for (int i = 0; i < K - 1; i++) {
    int d = (c >> (2 * i)) & 3;
    px[i + 1] = px[i] + dx[d];
    py[i + 1] = py[i] + dy[d];
  }
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> in[i][j];
    }
  }
  memset(dp, ~0, sizeof(dp));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (isdigit(in[i][j])) {
        int s = in[i][j] - '1';
        if (s + 1 > K) {
          K = s + 1;
          sx.resize(K);
          sy.resize(K);
        }
        sx[s] = i, sy[s] = j;
        in[i][j] = '.';
      } else if (in[i][j] == '@') {
        gx = i, gy = j;
        in[i][j] = '.';
      }
    }
  }
  queue<int> qx, qy, qs;
  qx.push(sx[0]);
  qy.push(sy[0]);
  qs.push(encode(sx, sy));
  dp[sx[0]][sy[0]][encode(sx, sy)] = 0;
  bool clear = false;
  while (!qx.empty()) {
    int hx = qx.front();
    qx.pop();
    int hy = qy.front();
    qy.pop();
    int hs = qs.front();
    qs.pop();
    if (hx == gx && hy == gy) {
      clear = true;
      cout << dp[hx][hy][hs] << endl;
      break;
    }
    vector<int> cx, cy;
    decode(hs, hx, hy, cx, cy);
    for (int i = 0; i < 4; i++) {
      int hxx = hx + dx[i], hyy = hy + dy[i];
      if (hxx >= 0 && hxx < n && hyy >= 0 && hyy < m) {
        if (in[hxx][hyy] == '#') continue;
        int die = 0;
        for (int j = 1; j < K - 1; j++) {
          if (hxx == cx[j] && hyy == cy[j]) {
            die = 1;
            break;
          }
        }
        if (die) continue;
        vector<int> cxx(K), cyy(K);
        cxx[0] = hxx, cyy[0] = hyy;
        for (int k = 1; k < K; k++) {
          cxx[k] = cx[k - 1];
          cyy[k] = cy[k - 1];
        }
        int hss = encode(cxx, cyy);
        if (!~dp[hxx][hyy][hss] || dp[hxx][hyy][hss] > dp[hx][hy][hs] + 1) {
          dp[hxx][hyy][hss] = dp[hx][hy][hs] + 1;
          qx.push(hxx);
          qy.push(hyy);
          qs.push(hss);
        }
      } else
        continue;
    }
  }
  if (!clear) {
    cout << "-1" << endl;
  }
  return 0;
}
