#include <bits/stdc++.h>
using namespace std;
double EPS = 1e-10;
double EQ(double a, double b) { return abs(a - b) < EPS; }
void fast_stream() { std::ios_base::sync_with_stdio(0); }
template <class T>
string IntToString(T num) {
  string res;
  stringstream ss;
  ss << num;
  return ss.str();
}
long long StringToInt(string &str) {
  long long res = 0;
  for (int i = 0; i < (int)str.size(); i++) res = (res * 10 + str[i] - '0');
  return res;
}
const int dy[] = {-1, 0, 0, 1};
const int dx[] = {0, -1, 1, 0};
int getValueInMask(int mask, int tani, int pos) {
  int res = 0;
  for (int i = tani - 1; i >= 0; i--)
    res = res * 2 + ((mask >> (pos * tani + i)) & 1);
  return res;
}
int setValueInMask(int mask, int tani, int pos, int value) {
  int nmask = mask;
  for (int i = 0; value != 0; i++) {
    int bit = value % 2;
    if (bit)
      nmask |= (1 << (tani * pos + i));
    else
      mask &= ~(1 << (tani * pos + i));
    value /= 2;
  }
  return nmask;
}
int H, W;
char field[20][20];
pair<int, int> pos[10];
int gy, gx;
int d[15][15][1 << 16];
int main() {
  memset(d, -1, sizeof(d));
  for (int i = 0; i < 10; i++) pos[i] = pair<int, int>(-1, -1);
  cin >> H >> W;
  for (int i = 0; i < H; i++)
    for (int j = 0; j < W; j++) cin >> field[i][j];
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      if (field[i][j] == '@') {
        gy = i;
        gx = j;
        field[i][j] = '.';
      } else if (field[i][j] >= '1' && field[i][j] <= '9') {
        int num = field[i][j] - '0';
        pos[num] = pair<int, int>(i, j);
        field[i][j] = '.';
      }
    }
  }
  vector<pair<int, int> > init;
  for (int i = 0; i < 10; i++)
    if (pos[i].first >= 0) init.push_back(pos[i]);
  int initMask = 0;
  int sy = init[0].first;
  int sx = init[0].second;
  int ssz = (int)init.size();
  for (int i = 1; i < (int)init.size(); i++) {
    for (int j = 0; j < 4; j++) {
      if (init[i].first - init[i - 1].first == dy[j] &&
          init[i].second - init[i - 1].second == dx[j]) {
        int ang = j;
        initMask = setValueInMask(initMask, 2, i - 1, ang);
        break;
      }
    }
  }
  queue<pair<pair<int, int>, int> > q;
  d[sy][sx][initMask] = 0;
  q.push(make_pair(pair<int, int>(sy, sx), initMask));
  while (q.size()) {
    pair<pair<int, int>, int> p = q.front();
    q.pop();
    int cy = p.first.first;
    int cx = p.first.second;
    int cmask = p.second;
    int ccost = d[cy][cx][cmask];
    int csy[10];
    int csx[10];
    csy[0] = cy;
    csx[0] = cx;
    for (int i = 1; i < ssz; i++) {
      int pos = i - 1;
      int ang = getValueInMask(cmask, 2, pos);
      csy[i] = csy[i - 1] + dy[ang];
      csx[i] = csx[i - 1] + dx[ang];
    }
    for (int i = 0; i < 4; i++) {
      int ny = cy + dy[i];
      int nx = cx + dx[i];
      if (ny >= 0 && nx >= 0 && ny < H && nx < W && field[ny][nx] != '#') {
        int nsy[10];
        int nsx[10];
        nsy[0] = ny;
        nsx[0] = nx;
        bool ok = true;
        for (int j = 1; j < ssz; j++) {
          nsy[j] = csy[j - 1];
          nsx[j] = csx[j - 1];
          if (nsy[j] == ny && nsx[j] == nx) ok = false;
        }
        if (!ok) continue;
        int nmask = 0;
        for (int j = 1; j < ssz; j++) {
          for (int k = 0; k < 4; k++) {
            if (nsy[j] - nsy[j - 1] == dy[k] && nsx[j] - nsx[j - 1] == dx[k]) {
              int ang = k;
              nmask = setValueInMask(nmask, 2, j - 1, ang);
              break;
            }
          }
        }
        if (d[ny][nx][nmask] == -1) {
          d[ny][nx][nmask] = ccost + 1;
          q.push(make_pair(pair<int, int>(ny, nx), nmask));
        }
      }
    }
  }
  int ans = 1 << 30;
  for (int mask = 0; mask < (1 << 16); mask++)
    if (d[gy][gx][mask] != -1) ans = min(ans, d[gy][gx][mask]);
  if (ans == (1 << 30)) ans = -1;
  cout << ans << endl;
  return 0;
}
