#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int dy[4]={-1,0,1,0};
int dx[4]={0,1,0,-1};


int H,W;
char si,ti;
int sy,sx;

char t[100][100];
bool inField(int y,int x){
  return (0<=y&&y<H&&0<=x&&x<W);
}
bool isAl(char ch){
  return ('A'<=ch&&ch<='Z');
}

int solve(){
  typedef pair<int,int> P;
  map< P , int > d;
  
  queue< P > Q;
  Q.push( P(sy,sx) );
  d[ P(sy,sx) ]=0;
  while(!Q.empty()){
    P p=Q.front();Q.pop();
    int py=p.first;
    int px=p.second;
    if( t[py][px]==ti )return d[p];
    
    for(int dir=0;dir<4;dir++){
      int ny=py+dy[dir];
      int nx=px+dx[dir];
      bool flag=true;

      
      while( inField(ny,nx) && !isAl(t[ny][nx]) ){
        ny+=dy[dir];
        nx+=dx[dir];
        if(t[ny][nx]=='.')flag=false;
        if(dx[dir]==0 && t[ny][nx]=='-')flag=false;
        if(dy[dir]==0 && t[ny][nx]=='|')flag=false;
      }
      
      if(!flag)continue;
      if( !inField(ny,nx) )continue;
      if( !isAl(t[ny][nx]) )continue;
      if( d.count( P(ny,nx) ) )continue;
      d[ P(ny,nx) ] = d[ P(py,px) ]+1;
      Q.push( P(ny,nx) );
    }
  }
  assert(0);
}

int main(){
  cin>>H>>W>>si>>ti;
  for(int i=0;i<H;i++){
    for(int j=0;j<W;j++){
      cin>>t[i][j];
      if(t[i][j]==si){
        sy=i;
        sx=j;
      }
    }
  }
  cout<<solve()<<endl;
  return 0;
}

