/* Rozwiazanie wzorcowe do zadania OSU (Osuszanie)
 * Autor: Jakub Radoszewski
 * Data: 23.12.2011
 * Opis: standardowy BFS dla wag 0 lub 1, uzywa kolejki dwustronnej.
 */

#include <cstdio>
#include <utility>
#include <deque>
using namespace std;

#define M 1010
#define INFTY 100000000

int n, m;
char t[M][M];
int d[M][M];
deque<pair<int, int> > kol;

int x[4] = {-1, 1, 0, 0};
int y[4] = {0, 0, -1, 1};
inline bool ins(int g, int h)
{
  return g >= 0 && g < h;
}

int bfs(pair<int, int> pocz)
{
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      d[i][j] = INFTY;
  d[pocz.first][pocz.second] = 0;
  kol.push_back(pocz);
  while (!kol.empty())
  {
    pair<int, int> p = kol.front();
    kol.pop_front();
    int u = p.first, v = p.second;
    if (t[p.first][p.second] == 'B') return d[p.first][p.second];
    for (int z = 0; z < 4; z++)
    {
      int a = u + x[z], b = v + y[z];
      if (!ins(a, n) || !ins(b, m)) continue;
      int waga = (t[a][b] == '#');
      if (d[a][b] > d[u][v] + waga)
      {
        d[a][b] = d[u][v] + waga;
        if (waga) kol.push_back(make_pair(a, b));
        else kol.push_front(make_pair(a, b));
      }
    }
  }
  return -1;
}

int main()
{
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) scanf("%s", t[i]);

  pair<int, int> pocz;
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j)
      if (t[i][j] == 'A')
        pocz = make_pair(i, j);
  printf("%d\n", bfs(pocz));
  return 0;
}
