#include <bits/stdc++.h>
using namespace std;
int newMask[1000000][4];
bool canMove[1000000][4];
int mv[][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int len;
int getMove(int x, int y) {
  if (x == 1 && y == 0) return 0;
  if (x == 0 && y == 1) return 1;
  if (x == -1 && y == 0) return 2;
  return 3;
}
vector<pair<int, int> > getLoc(int mask) {
  vector<pair<int, int> > ret;
  ret.push_back(make_pair(0, 0));
  for (int i = 0; i + 1 < len; i++) {
    int j = mask % 4;
    mask /= 4;
    int x = ret[ret.size() - 1].first + mv[j][0];
    int y = ret[ret.size() - 1].second + mv[j][1];
    ret.push_back(make_pair(x, y));
  }
  reverse(ret.begin(), ret.end());
  return ret;
}
int getMask(vector<pair<int, int> > loc) {
  int ret = 0;
  for (int i = 0; i + 1 < loc.size(); i++) {
    int x = loc[i].first - loc[i + 1].first;
    int y = loc[i].second - loc[i + 1].second;
    ret = ret * 4 + getMove(x, y);
  }
  return ret;
}
void precalc() {
  int num = len - 1;
  for (int i = 0; i < (1 << (2 * num)); i++) {
    vector<pair<int, int> > loc = getLoc(i);
    for (int x = 0; x < 4; x++) {
      bool ok = 1;
      for (int j = 1; j < loc.size(); j++) {
        if (mv[x][0] == loc[j].first && mv[x][1] == loc[j].second) ok = 0;
      }
      if (ok) {
        canMove[i][x] = true;
        vector<pair<int, int> > newLoc = loc;
        newLoc.erase(newLoc.begin());
        newLoc.push_back(make_pair(mv[x][0], mv[x][1]));
        newMask[i][x] = getMask(newLoc);
      }
    }
  }
}
pair<int, int> l[10];
int n, m;
char a[100][100];
int dist[16][16][70000];
bool vis[16][16][70000];
int X, Y;
int ans;
int bfs(pair<int, int> v, int mask) {
  ans = 1000000000;
  queue<pair<int, int> > q1;
  queue<int> q2;
  q1.push(v);
  q2.push(mask);
  vis[v.first][v.second][mask] = 1;
  while (!q1.empty()) {
    v = q1.front();
    q1.pop();
    mask = q2.front();
    q2.pop();
    if (v == make_pair(X, Y)) ans = min(ans, dist[v.first][v.second][mask]);
    for (int x = 0; x < 4; x++) {
      if (!canMove[mask][x]) continue;
      pair<int, int> u = v;
      u.first += mv[x][0];
      u.second += mv[x][1];
      if (u.first < 0 || u.first >= n || u.second < 0 || u.second >= m ||
          a[u.first][u.second] == '#')
        continue;
      int uMask = newMask[mask][x];
      if (vis[u.first][u.second][uMask]) continue;
      dist[u.first][u.second][uMask] = 1 + dist[v.first][v.second][mask];
      vis[u.first][u.second][uMask] = 1;
      q1.push(u);
      q2.push(uMask);
    }
  }
  if (ans == 1000000000) return -1;
  return ans;
}
void getInput() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> a[i][j];
      if (a[i][j] >= '1' && a[i][j] <= '9')
        len++, l[a[i][j] - '0'] = make_pair(i, j);
      if (a[i][j] == '@') X = i, Y = j;
    }
  }
  vector<pair<int, int> > fLoc;
  for (int i = len; i >= 1; i--) fLoc.push_back(l[i]);
  precalc();
  int mask = getMask(fLoc);
  cout << bfs(fLoc[fLoc.size() - 1], mask) << endl;
}
int main() { getInput(); }
