#include <bits/stdc++.h>
using namespace std;
typedef struct node {
  int xh, yh;
  int m1, m2;
} node;
int r, c, x[18], y[18], tail, dist[15][15][1 << 8][1 << 8], xm, ym;
char mat[18][18];
void f(int i, int j, int m1, int m2) {
  int b1, b2;
  x[1] = i;
  y[1] = j;
  for (int k = 0; k < tail - 1; k++) {
    b1 = m1 & (1 << k);
    b2 = m2 & (1 << k);
    if (b1 && b2) {
      x[k + 2] = x[k + 1] + 1;
      y[k + 2] = y[k + 1];
    } else if (b1 && !b2) {
      x[k + 2] = x[k + 1] - 1;
      y[k + 2] = y[k + 1];
    } else if (!b1 && b2) {
      x[k + 2] = x[k + 1];
      y[k + 2] = y[k + 1] + 1;
    } else {
      x[k + 2] = x[k + 1];
      y[k + 2] = y[k + 1] - 1;
    }
  }
  return;
}
int bfs(int M1, int M2) {
  int i, j, m1, m2, flag;
  int m11, m22;
  node aux;
  queue<node> q;
  memset(dist, -1, sizeof(dist));
  aux.xh = x[1];
  aux.yh = y[1];
  aux.m1 = M1;
  aux.m2 = M2;
  dist[x[1]][y[1]][M1][M2] = 0;
  q.push(aux);
  while (!q.empty()) {
    aux = q.front();
    q.pop();
    i = aux.xh;
    j = aux.yh;
    m1 = aux.m1;
    m2 = aux.m2;
    if (mat[i][j] == '@') return dist[i][j][m1][m2];
    if (i && mat[i - 1][j] != '#') {
      f(i, j, m1, m2);
      flag = 1;
      for (int k = tail; k > 1; k--) {
        x[k] = x[k - 1];
        y[k] = y[k - 1];
        if (x[k] == i - 1 && y[k] == j) {
          flag = 0;
          break;
        }
      }
      if (flag) {
        m11 = m1 & 127;
        m22 = m2 & 127;
        m11 = m11 << 1;
        m22 = m22 << 1;
        m11 |= 1;
        m22 |= 1;
        if (dist[i - 1][j][m11][m22] == -1) {
          dist[i - 1][j][m11][m22] = dist[i][j][m1][m2] + 1;
          aux.xh = i - 1;
          aux.yh = j;
          aux.m1 = m11;
          aux.m2 = m22;
          q.push(aux);
        }
      }
    }
    if (i < r - 1 && mat[i + 1][j] != '#') {
      f(i, j, m1, m2);
      flag = 1;
      for (int k = tail; k > 1; k--) {
        x[k] = x[k - 1];
        y[k] = y[k - 1];
        if (x[k] == i + 1 && y[k] == j) {
          flag = 0;
          break;
        }
      }
      if (flag) {
        m11 = m1 & 127;
        m22 = m2 & 127;
        m11 = m11 << 1;
        m22 = m22 << 1;
        m11 |= 1;
        if (dist[i + 1][j][m11][m22] == -1) {
          dist[i + 1][j][m11][m22] = dist[i][j][m1][m2] + 1;
          aux.xh = i + 1;
          aux.yh = j;
          aux.m1 = m11;
          aux.m2 = m22;
          q.push(aux);
        }
      }
    }
    if (j && mat[i][j - 1] != '#') {
      f(i, j, m1, m2);
      flag = 1;
      for (int k = tail; k > 1; k--) {
        x[k] = x[k - 1];
        y[k] = y[k - 1];
        if (x[k] == i && y[k] == j - 1) {
          flag = 0;
          break;
        }
      }
      if (flag) {
        m11 = m1 & 127;
        m22 = m2 & 127;
        m11 = m11 << 1;
        m22 = m22 << 1;
        m22 |= 1;
        if (dist[i][j - 1][m11][m22] == -1) {
          dist[i][j - 1][m11][m22] = dist[i][j][m1][m2] + 1;
          aux.xh = i;
          aux.yh = j - 1;
          aux.m1 = m11;
          aux.m2 = m22;
          q.push(aux);
        }
      }
    }
    if (j < c - 1 && mat[i][j + 1] != '#') {
      f(i, j, m1, m2);
      flag = 1;
      for (int k = tail; k > 1; k--) {
        x[k] = x[k - 1];
        y[k] = y[k - 1];
        if (x[k] == i && y[k] == j + 1) {
          flag = 0;
          break;
        }
      }
      if (flag) {
        m11 = m1 & 127;
        m22 = m2 & 127;
        m11 = m11 << 1;
        m22 = m22 << 1;
        if (dist[i][j + 1][m11][m22] == -1) {
          dist[i][j + 1][m11][m22] = dist[i][j][m1][m2] + 1;
          aux.xh = i;
          aux.yh = j + 1;
          aux.m1 = m11;
          aux.m2 = m22;
          q.push(aux);
        }
      }
    }
  }
  return -1;
}
int main() {
  int M1, M2;
  scanf("%d%d", &r, &c);
  for (int i = 0; i < r; i++) scanf(" %s", mat[i]);
  tail = 0;
  for (int i = 0; i < r; i++)
    for (int j = 0; j < c; j++)
      if (mat[i][j] >= '1' && mat[i][j] <= '9') {
        x[mat[i][j] - '0'] = i;
        y[mat[i][j] - '0'] = j;
        tail = max(tail, mat[i][j] - '0');
      }
  M1 = M2 = 0;
  for (int i = 1; i < tail; i++) {
    if (y[i + 1] == y[i] + 1)
      M2 |= (1 << (i - 1));
    else if (x[i + 1] == x[i] - 1)
      M1 |= (1 << (i - 1));
    else if (x[i + 1] == x[i] + 1) {
      M1 |= (1 << (i - 1));
      M2 |= (1 << (i - 1));
    }
  }
  printf("%d\n", bfs(M1, M2));
  return 0;
}
