#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:25600000")
using namespace std;
const int MAXN = 204800;
const int INF = 1000010000;
const long long MOD = 1000000007;
struct T {
  int x, y;
  int n;
  int d[10];
  T() {
    x = y = n = 0;
    memset(d, 0, sizeof d);
    ;
  }
  bool operator<(const T& other) const {
    if (x != other.x) return x < other.x;
    if (y != other.y) return y < other.y;
    if (n != other.n) return n < other.n;
    for (int i = 0; i < n - 1; ++i)
      if (d[i] != other.d[i]) return d[i] < other.d[i];
    return false;
  }
  bool operator==(const T& other) const {
    if (x != other.x) return false;
    if (y != other.y) return false;
    if (n != other.n) return false;
    for (int i = 0; i < n - 1; ++i)
      if (d[i] != other.d[i]) return false;
    return true;
  }
};
set<T> processed;
int a[20][20];
bool u[20][20];
int N, M;
bool valid(const T& t) {
  bool res = true;
  int x = t.x;
  int y = t.y;
  for (int i = 0; i < t.n; ++i) {
    if (u[x][y]) res = false;
    u[x][y] = true;
    if (x < 1 || x > N || y < 1 || y > M) res = false;
    if (a[x][y] == 10) res = false;
    if (t.d[i] == 1) ++x;
    if (t.d[i] == 2) --x;
    if (t.d[i] == 3) ++y;
    if (t.d[i] == 4) --y;
  }
  x = t.x;
  y = t.y;
  for (int i = 0; i < t.n; ++i) {
    u[x][y] = false;
    if (t.d[i] == 1) ++x;
    if (t.d[i] == 2) --x;
    if (t.d[i] == 3) ++y;
    if (t.d[i] == 4) --y;
  }
  return res;
}
T get_next(const T& t, int dir) {
  T res;
  res.n = t.n;
  res.x = t.x;
  res.y = t.y;
  if (dir == 1) {
    ++res.x;
    res.d[0] = 2;
  }
  if (dir == 2) {
    --res.x;
    res.d[0] = 1;
  }
  if (dir == 3) {
    ++res.y;
    res.d[0] = 4;
  }
  if (dir == 4) {
    --res.y;
    res.d[0] = 3;
  }
  for (long long i = 1; i <= t.n - 2; ++i) res.d[i] = t.d[i - 1];
  for (long long i = t.n - 1; i <= 9; ++i) res.d[i] = 0;
  return res;
}
inline bool apple(const T& t) { return a[t.x][t.y] == 100; }
T get_initial() {
  T res;
  for (long long i = 1; i <= N; ++i)
    for (long long j = 1; j <= M; ++j) {
      if (a[i][j] == 1) {
        res.x = i;
        res.y = j;
      }
      if (a[i][j] >= 1 && a[i][j] <= 9) {
        res.n = max(res.n, a[i][j]);
      }
      if (a[i][j] > 1 && a[i][j] <= 9) {
        if (a[i - 1][j] + 1 == a[i][j]) res.d[a[i][j] - 2] = 1;
        if (a[i + 1][j] + 1 == a[i][j]) res.d[a[i][j] - 2] = 2;
        if (a[i][j - 1] + 1 == a[i][j]) res.d[a[i][j] - 2] = 3;
        if (a[i][j + 1] + 1 == a[i][j]) res.d[a[i][j] - 2] = 4;
      }
    }
  return res;
}
pair<T, int> q[2000000];
set<T> ss;
int l = 0, r = 0;
int solve() {
  T cur = get_initial();
  ss.insert(cur);
  q[r++] = make_pair(cur, 0);
  while (l < r) {
    int w = q[l].second;
    cur = q[l].first;
    ++l;
    if (apple(cur)) return w;
    for (long long dir = 1; dir <= 4; ++dir) {
      T next = get_next(cur, dir);
      if (valid(next) && ss.find(next) == ss.end()) {
        q[r++] = (make_pair(next, w + 1));
        ss.insert(next);
      }
    }
  }
  return -1;
}
char s[20];
int main() {
  scanf("%d%d\n", &N, &M);
  for (long long i = 1; i <= N; ++i) {
    scanf("%s", s);
    for (int j = 0; j < M; ++j) {
      if (s[j] == '#') a[i][j + 1] = 10;
      if (s[j] == '@') a[i][j + 1] = 100;
      if (s[j] >= '1' && s[j] <= '9') a[i][j + 1] = s[j] - '0';
    }
  }
  printf("%d\n", solve());
}
