#include <bits/stdc++.h>
using namespace std;
map<long long int, long long int> used[16][16];
string mp[16];
long long int n, m;
long long int dx[] = {1, 0, -1, 0};
long long int dy[] = {0, 1, 0, -1};
long long int cur[16][16];
long long int getIndex(vector<long long int> v) {
  long long int x = 0, y = 0;
  long long int res = 0;
  for (long long int i = 0; i < ((long long int)(((long long int)(v).size())));
       ++i)
    res = res * 5 + (v[i] + 1);
  for (long long int i = 0; i < ((long long int)(((long long int)(v).size())));
       ++i) {
    x += dx[v[i]];
    y += dy[v[i]];
  }
  for (long long int i = ((long long int)(v).size()) - 1; 0 <= i; i--) {
    if (abs(x) + abs(y) <= (((long long int)(v).size()) - 1 - i)) break;
    res /= 5;
    x -= dx[v[i]];
    y -= dy[v[i]];
  }
  return res;
}
int main() {
  cin >> n >> m;
  for (long long int i = 0; i < ((long long int)(n)); ++i) cin >> mp[i];
  queue<pair<pair<long long int, long long int>, vector<long long int> > > q;
  for (long long int i = 0; i < ((long long int)(n)); ++i)
    for (long long int j = 0; j < ((long long int)(m)); ++j)
      if (mp[i][j] == '1') {
        vector<long long int> v;
        long long int x = i;
        long long int y = j;
        for (bool updated = true; updated;) {
          updated = false;
          for (long long int dir = 0; dir < ((long long int)(4)); ++dir) {
            long long int xx = x + dx[dir];
            long long int yy = y + dy[dir];
            if (xx < 0 || n <= xx) continue;
            if (yy < 0 || m <= yy) continue;
            if (mp[x][y] + 1 != mp[xx][yy]) continue;
            v.push_back(dir);
            updated = true;
            x = xx;
            y = yy;
          }
        }
        used[i][j][getIndex(v)] = true;
        q.push(make_pair(make_pair(i, j), v));
      }
  long long int stamp = 0;
  memset(cur, -1, sizeof(cur));
  for (long long int step = 0; ((long long int)(q).size()); step++) {
    queue<pair<pair<long long int, long long int>, vector<long long int> > >
        next;
    while (((long long int)(q).size())) {
      long long int x = q.front().first.first;
      long long int y = q.front().first.second;
      vector<long long int> index = q.front().second;
      q.pop();
      for (long long int dir = 0; dir < ((long long int)(4)); ++dir) {
        long long int xx = x + dx[dir];
        long long int yy = y + dy[dir];
        if (xx < 0 || n <= xx) continue;
        if (yy < 0 || m <= yy) continue;
        if (mp[xx][yy] == '#') continue;
        if (mp[xx][yy] == '@') {
          cout << step + 1 << endl;
          return 0;
        }
        memset(cur, 0, sizeof(cur));
        long long int cx = x;
        long long int cy = y;
        stamp++;
        cur[cx][cy] = stamp;
        for (long long int i = 0;
             i < ((long long int)(((long long int)(index).size()) - 1)); ++i) {
          cx += dx[index[i]];
          cy += dy[index[i]];
          cur[cx][cy] = stamp;
        }
        if (cur[xx][yy] == stamp) continue;
        vector<long long int> v;
        v.push_back(dir ^ 2);
        for (long long int i = 0;
             i < ((long long int)(((long long int)(index).size()) - 1)); ++i)
          v.push_back(index[i]);
        if (used[xx][yy].find(getIndex(v)) != used[xx][yy].end()) continue;
        used[xx][yy][getIndex(v)] = true;
        next.push(make_pair(make_pair(xx, yy), v));
      }
    }
    q = next;
  }
  cout << -1 << endl;
}
