#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int INF = 1e9 + 10;
const long long LINF = 1e17 + 10;
struct triple {
  int X, Y, M;
  triple(const int &a, const int &b, const int &c) { X = b, Y = c, M = a; }
};
const int MN = 15 + 2;
char ch[MN][MN];
pair<int, int> head, apple;
int bfs[(1 << 15)][MN][MN];
bool mk[(1 << 15)][MN][MN];
int sz;
queue<triple> q;
int x[4] = {-1, 0, 0, 1};
int y[4] = {0, -1, 1, 0};
int Msk, n, m;
bool valid(int r, int c) {
  if (min(r, c) < 0 || r >= n || c >= m) return false;
  if (ch[r][c] == '#') return false;
  return true;
}
void BFS();
void input() {
  cin >> n >> m;
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j) {
      cin >> ch[i][j];
      if (ch[i][j] == '@') apple = pair<int, int>(i, j);
      if (ch[i][j] == '1') head = pair<int, int>(i, j);
      if ('0' <= ch[i][j] && ch[i][j] <= '9') sz = max(sz, ch[i][j] - '0');
    }
  sz -= 2;
  for (int i = 0; i < (1 << (sz + sz)); ++i) {
    for (int j = 0; j < n; ++j)
      for (int l = 0; l < m; ++l) bfs[i][j][l] = INF;
  }
  int cx = head.first, cy = head.second;
  for (int i = 0; i < sz; ++i) {
    for (int j = 0; j < 4; ++j) {
      if (ch[cx + x[j]][cy + y[j]] == i + 2 + '0') {
        cx += x[j], cy += y[j];
        Msk |= ((3 - j) << (i + i));
        break;
      }
    }
  }
  BFS();
}
void BFS() {
  int cx, cy, msk;
  set<pair<int, int> > s;
  q.push(triple(Msk, head.first, head.second));
  mk[Msk][head.first][head.second] = true;
  bfs[Msk][head.first][head.second] = 0;
  while (q.size()) {
    cx = q.front().X, cy = q.front().Y, msk = q.front().M;
    s.clear();
    for (int i = 0; i < sz; ++i) {
      cx += x[3 - (msk % 4)], cy += y[3 - (msk % 4)];
      s.insert(pair<int, int>(cx, cy));
      msk /= 4;
    }
    int tmp;
    cx = q.front().X, cy = q.front().Y, msk = q.front().M;
    for (int i = 0; i < 4; ++i) {
      tmp = (((1 << (sz + sz)) - 1) & (msk << 2)) + i;
      if (valid(cx + x[i], cy + y[i]) &&
          s.find(pair<int, int>(cx + x[i], cy + y[i])) == s.end() &&
          !mk[tmp][cx + x[i]][cy + y[i]]) {
        mk[tmp][cx + x[i]][cy + y[i]] = true;
        bfs[tmp][cx + x[i]][cy + y[i]] = bfs[msk][cx][cy] + 1;
        q.push(triple(tmp, cx + x[i], cy + y[i]));
      }
    }
    q.pop();
  }
}
void solve() {
  int mn = INF;
  for (int i = 0; i < (1 << (sz + sz)); ++i)
    mn = min(mn, bfs[i][apple.first][apple.second]);
  if (mn == INF)
    cout << -1 << endl;
  else
    cout << mn << endl;
}
int main() {
  input();
  solve();
  return 0;
}
