#include <bits/stdc++.h>
using namespace std;
int dr[][2] = {-1, 0, 0, -1, 1, 0, 0, 1};
int n, m, k;
int h[15];
struct node {
  int p[10];
  int pr;
  int hash;
  int dis;
} start;
char mp[20][20];
void dfs(int x, int y) {
  start.p[k++] = x * m + y;
  for (int i = 0; i < 4; i++) {
    int a = x + dr[i][0];
    int b = y + dr[i][1];
    if (a < 0 || b < 0 || a >= n || b >= m) continue;
    if (mp[a][b] == mp[x][y] + 1) {
      dfs(a, b);
      break;
    }
  }
}
queue<node> q;
set<int> S;
int main() {
  cin >> n >> m;
  h[0] = 1;
  for (int i = 1; i <= 10; i++) h[i] = h[i - 1] * 100007;
  k = 0;
  for (int i = 0; i < n; i++) cin >> mp[i];
  for (int i = 0; i < n && !k; i++)
    for (int j = 0; j < m && !k; j++)
      if (mp[i][j] == '1') dfs(i, j);
  start.hash = start.dis = start.pr = 0;
  for (int i = k - 1; i >= 0; i--)
    start.hash = start.hash * 100007 + start.p[i];
  q.push(start);
  while (!q.empty()) {
    node u = q.front();
    q.pop();
    int f = u.pr;
    for (int i = 0; i < 4; i++) {
      int a = u.p[f] / m + dr[i][0];
      int b = u.p[f] % m + dr[i][1];
      if (a < 0 || b < 0 || a >= n || b >= m || mp[a][b] == '#') continue;
      if (mp[a][b] == '@') {
        cout << u.dis + 1 << endl;
        return 0;
      }
      int j;
      for (j = 1; j < k - 1; j++)
        if (a * m + b == u.p[(f + j) % k]) break;
      if (j >= k - 1) {
        int t = (u.hash - u.p[(f - 1 + k) % k] * h[k - 1]) * 100007 + a * m + b;
        if (S.find(t) == S.end()) {
          S.insert(t);
          node tp = u;
          tp.pr = (f - 1 + k) % k;
          tp.hash = t;
          tp.dis++;
          tp.p[tp.pr] = a * m + b;
          q.push(tp);
        }
      }
    }
  }
  cout << -1 << endl;
}
