#include <bits/stdc++.h>
using namespace std;
int ocupado[20][20];
int posi[10];
int posj[10];
int maxindice = 0;
int ifin, jfin, iini, jini;
int movi[] = {0, -1, 0, 1};
int movj[] = {1, 0, -1, 0};
int direccion[9];
int visto[1 << 24];
void marca(int i, int j) {
  ocupado[i][j] = 1;
  for (int t = 0; t < maxindice - 1; t++) {
    i += movi[direccion[t]];
    j += movj[direccion[t]];
    ocupado[i][j] = 1;
  }
}
void desmarca(int i, int j) {
  ocupado[i][j] = 0;
  for (int t = 0; t < maxindice - 1; t++) {
    i += movi[direccion[t]];
    j += movj[direccion[t]];
    ocupado[i][j] = 0;
  }
}
int codifica(int i, int j) {
  int c = 0;
  for (int d = 0; d < maxindice - 1; d++) c += direccion[d] << (2 * d);
  c += i << (2 * (maxindice - 1));
  c += j << (2 * (maxindice - 1) + 4);
  return c;
}
void decodifica(int c, int &i, int &j) {
  for (int d = 0; d < maxindice - 1; d++) direccion[d] = (c >> (2 * d)) & 3;
  i = (c >> (2 * (maxindice - 1))) & 15;
  j = (c >> (2 * (maxindice - 1) + 4)) & 15;
}
int main() {
  for (int i = 0; i < 20; i++)
    for (int j = 0; j < 20; j++) ocupado[i][j] = 1;
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      char c;
      cin >> c;
      if (c == '#') {
      } else if (c == '@') {
        ocupado[i][j] = 0;
        ifin = i;
        jfin = j;
      } else if (c == '.') {
        ocupado[i][j] = 0;
      } else {
        ocupado[i][j] = 0;
        int val = c - '1';
        posi[val] = i;
        posj[val] = j;
        maxindice = max(maxindice, val);
        if (val == 0) {
          iini = i;
          jini = j;
        }
      }
    }
  }
  {
    int i = iini;
    int j = jini;
    for (int d = 0; d < maxindice - 1; d++) {
      for (int k = 0; k < 4; k++) {
        int nexti = i + movi[k];
        int nextj = j + movj[k];
        if (posi[d + 1] == nexti and posj[d + 1] == nextj) {
          i = nexti;
          j = nextj;
          direccion[d] = k;
          break;
        }
      }
    }
  }
  int cini = codifica(iini, jini);
  visto[cini] = 1;
  vector<int> v(1, cini);
  int pasos = 0;
  while (not v.empty()) {
    pasos++;
    vector<int> nextv;
    for (int t = 0; t < int(v.size()); t++) {
      int c = v[t];
      int i, j;
      decodifica(c, i, j);
      marca(i, j);
      for (int k = 0; k < 4; k++) {
        int nexti = i + movi[k];
        int nextj = j + movj[k];
        if (nexti == ifin and nextj == jfin) {
          cout << pasos << endl;
          exit(0);
        }
        if (not ocupado[nexti][nextj]) {
          int nextc = (c << 2) + (k + 2) % 4;
          nextc &= (1 << (2 * (maxindice - 1))) - 1;
          nextc += nexti << (2 * (maxindice - 1));
          nextc += nextj << (2 * (maxindice - 1) + 4);
          if (not visto[nextc]) {
            visto[nextc] = 1;
            nextv.push_back(nextc);
          }
        }
      }
      desmarca(i, j);
    }
    v = nextv;
  }
  cout << -1 << endl;
}
