#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int R, C;
char grass[102][102];
int R_B, C_B;
int R_C, C_C;
void read ()
{
cin>>R>>C;
for (int i=1; i<=R; i++)
{
for (int j=1; j<=C; j++)
{
cin>>grass[i][j];
if (grass[i][j]=='B')
{
R_B = i;
C_B = j;
}
if (grass[i][j]=='C')
{
R_C = i;
C_C = j;
}
}
}
}
int check[102][102];
int mark[102][102];
struct data
{
int r, c;
} typedef data;
vector <data> v[102][102];
int y_ar[]={+0, -1, +0, +1};
int x_ar[]={+1, +0, -1, +0};
void init ()
{
for (int i=1; i<=R; i++)
for (int j=1; j<=C; j++)
{
check[i][j]=0;
mark[i][j]=0;
}
for (int i=1; i<=R; i++)
for (int j=1; j<=C; j++)
if (grass[i][j]=='.' || grass[i][j]=='B' || grass[i][j]=='C')
for (int k=0; k<4; k++)
{
int Y=i+y_ar[k];
int X=j+x_ar[k];
if (Y>=1 && Y<=R && X>=1 && X<=C && (grass[Y][X]=='.' || grass[Y][X]=='B' || grass[Y][X]=='C'))
{
data tmp;
tmp.r=Y;
tmp.c=X;
v[i][j].push_back(tmp);
}
}
}
queue <data> q;
void BFS ()
{
int i=R_B, j=C_B;
data tmp;
tmp.r=i;
tmp.c=j;
q.push (tmp);
check[i][j]=1;
while (!q.empty())
{
data u = q.front();
q.pop();
for (int k=0; k<v[u.r][u.c].size(); k++)
{
data tmp = v[u.r][u.c][k];
if (check[tmp.r][tmp.c]==0)
{
q.push (tmp);
check[tmp.r][tmp.c]=1;
mark [tmp.r][tmp.c]=mark[u.r][u.c]+1;
}
}
}
}
int main ()
{
read ();
init ();
BFS ();
cout<<mark[R_C][C_C];
return 0;
}