#include <bits/stdc++.h>
using namespace std;
short int i, j, k, l, n, m, fx, fy;
struct snake {
  short int x, y, sz;
  pair<short int, short int> next[19];
};
short int v[19][19];
inline bool operator<(const snake &a, const snake &b) {
  if (a.x != b.x) return a.x < b.x;
  if (a.y != b.y) return a.y < b.y;
  for (int i = 1; i < a.sz; i++) {
    if (a.next[i].first != b.next[i].first)
      return a.next[i].first < b.next[i].first;
    if (a.next[i].second != b.next[i].second)
      return a.next[i].second < b.next[i].second;
  }
  return false;
}
map<snake, short int> vis;
queue<pair<snake, short int> > q;
inline void check(snake a, short int xx, short int yy, short int way) {
  int x = a.x, y = a.y;
  if (xx + x < 1 || xx + x > n || yy + y < 1 || yy + y > m ||
      v[x + xx][y + yy] == 1)
    return;
  a.x = xx + x;
  a.y = yy + y;
  for (int i = a.sz - 1; i > 1; i--) a.next[i] = a.next[i - 1];
  a.next[1] = {(short int)-xx, (short int)-yy};
  x = a.x;
  y = a.y;
  for (i = 1; i < a.sz; i++) {
    x += a.next[i].first;
    y += a.next[i].second;
    if (x == a.x && y == a.y) {
      return;
    }
  }
  if (vis[a] == 0) {
    vis[a] = 1;
    q.push({a, way});
  }
  if (a.x == fx && a.y == fy) {
    cout << way << endl;
    exit(0);
  }
  return;
}
pair<short int, short int> num[19];
string s;
int sz;
snake st;
int main() {
  vis.clear();
  cin >> n >> m;
  for (i = 1; i <= n; i++) {
    cin >> s;
    for (j = 0; j < m; j++) {
      if (s[j] <= '9' && s[j] >= '1') {
        int val = s[j] - '1';
        num[val] = {i, j + 1};
        sz = max(sz, (int)s[j] - '0');
      }
      if (s[j] == '@') {
        fx = i;
        fy = j + 1;
      }
      if (s[j] == '#') v[i][j + 1] = 1;
    }
  }
  st.sz = sz;
  int x = num[0].first, y = num[0].second;
  st.x = x;
  st.y = y;
  for (i = 1; i < sz; i++) {
    st.next[i] = {num[i].first - x, num[i].second - y};
    x = num[i].first;
    y = num[i].second;
  }
  vis[st] = 1;
  q.push({st, 0});
  while (!q.empty()) {
    st = q.front().first;
    int way = q.front().second;
    q.pop();
    check(st, 1, 0, way + 1);
    check(st, -1, 0, way + 1);
    check(st, 0, 1, way + 1);
    check(st, 0, -1, way + 1);
  }
  cout << -1 << endl;
  return 0;
}
