#include <bits/stdc++.h>
using namespace std;
int n, m, len, dir[4][2] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
char c[20][20];
int vis[20][20];
struct snakes {
  int deep;
  pair<int, int> body_[12];
  char t[20][20];
};
int applex, appley;
queue<snakes> q;
int main() {
  snakes front_;
  cin >> n >> m;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      cin >> c[i][j];
      if (isdigit(c[i][j])) {
        len = max(len, c[i][j] - '0');
        front_.body_[c[i][j] - '0'].first = i,
                               front_.body_[c[i][j] - '0'].second = j;
      }
    }
  memset(vis, 0, sizeof(vis));
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) front_.t[i][j] = c[i][j];
  front_.deep = 0;
  q.push(front_);
  while (!q.empty()) {
    front_ = q.front();
    q.pop();
    int headx, heady;
    headx = front_.body_[1].first, heady = front_.body_[1].second;
    for (int i = 0; i < 4; i++) {
      int ux = headx + dir[i][0], vy = heady + dir[i][1];
      if (ux < 0 || ux >= n || vy < 0 || vy >= m || vis[ux][vy] >= 120 ||
          c[ux][vy] == '#' ||
          (isdigit(front_.t[ux][vy]) && front_.t[ux][vy] != len + '0'))
        continue;
      if (c[ux][vy] == '@') {
        cout << front_.deep + 1;
        return 0;
      }
      vis[ux][vy]++;
      snakes go_it;
      go_it = front_;
      go_it.deep = front_.deep + 1;
      go_it.body_[1] = make_pair(ux, vy);
      for (int i = 2; i <= len; i++)
        go_it.body_[i] =
            make_pair(front_.body_[i - 1].first, front_.body_[i - 1].second);
      go_it.t[front_.body_[len].first][front_.body_[len].second] == '.';
      for (int i = 1; i <= len; i++)
        go_it.t[go_it.body_[i].first][go_it.body_[i].second] = i + '0';
      q.push(go_it);
    }
  }
  cout << "-1";
}
