#include<bits/stdc++.h>
using namespace std;
 
struct Dice{
  int s[6],f;
  Dice(){}
  void roll(char c){
    int b;
    if(c=='E'||c==3){
      b=s[0];
      s[0]=s[3];
      s[3]=s[5];
      s[5]=s[2];
      s[2]=b;
    }
    if(c=='W'||c==1){
      b=s[0];
      s[0]=s[2];
      s[2]=s[5];
      s[5]=s[3];
      s[3]=b;
    }
    if(c=='N'||c==0){
      b=s[0];
      s[0]=s[1];
      s[1]=s[5];
      s[5]=s[4];
      s[4]=b;
    }
    if(c=='S'||c==2){
      b=s[0];
      s[0]=s[4];
      s[4]=s[5];
      s[5]=s[1];
      s[1]=b;
    }
 
    if(c=='R'){
      b=s[1];
      s[1]=s[3];
      s[3]=s[4];
      s[4]=s[2];
      s[2]=b;
    }
    if(c=='L'){
      b=s[1];
      s[1]=s[2];
      s[2]=s[4];
      s[4]=s[3];
      s[3]=b;
    }
  }
  int top(){
    if(f) return 3;
    return s[0];
  }
  int hash(){
    if(f) return -1;
    int res=0;
    for(int i=0;i<6;i++) res=res*4+s[i];
    return res;
  }
};
 
map<int,int> mi;
map<int,Dice> md;
void makeDices(Dice d){
  for(int i=0;i<6;i++){
    Dice t(d);
    if(i==1) t.roll('N');
    if(i==2) t.roll('S');
    if(i==3) t.roll('S'),t.roll('S');
    if(i==4) t.roll('L');
    if(i==5) t.roll('R');
    for(int k=0;k<4;k++){
      int h=t.hash(),p=mi.size();
      //cout<<h<<"-"<<p<<endl;
      if(!mi.count(h)){
    mi[h]=p;
    md[p]=t;
    //cout<<p<<":"<<h<<"-"<<t.f<<endl;
      }
      t.roll('E');
    }
  }
  //cout<<md.size()<<endl;
  d.f=1;
  mi[-1]=6;
  md[6]=d;
}
 
int tv(vector<Dice>& ds){
  int res=0;
  for(int i=0;i<9;i++)
    res=res*4+ds[i].top();
  return res;
}
 
int ds2i(vector<Dice>& ds){
  int res=0;
  for(int i=8;i>=0;i--) res=res*7+mi[ds[i].hash()];
  return res;
}
void i2ds(int x,vector<Dice>& ds){
  for(int i=0;i<9;i++){
    ds[i]=md[x%7];
    x/=7;
  }
}
char dp[40353607+1];
signed main(){
  int y,x;
  while(cin>>x>>y,x||y){
    x--;y--;
    char f[3][3];
    for(int i=0;i<3;i++)
      for(int j=0;j<3;j++)
	cin>>f[i][j];
    int en=0;
    for(int i=0;i<3;i++){
      for(int j=0;j<3;j++){
	int k=3;
	if(f[i][j]=='B') k=0;
	if(f[i][j]=='W') k=1;
	if(f[i][j]=='R') k=2;
	//cout<<k<<":";
	en=en*4+k;
      }
    }
    //cout<<endl;
 
    //cout<<en<<endl;
     
    vector<Dice> ds(9);
    Dice d;
    d.s[0]=d.s[5]=1;
    d.s[2]=d.s[3]=0;
    d.s[1]=d.s[4]=2;
    d.f=0;
 
    makeDices(d);
     
    for(int i=0;i<3;i++){
      for(int j=0;j<3;j++){
	ds[i*3+j]=d;
	if(y==i&&x==j) ds[i*3+j].f=1;
	//cout<<i*3+j<<"="<<ds[i*3+j].f<<"/"<<ds[i*3+j].top()<<endl;
      }
    }
 
    //for(int i=0;i<3;i++) for(int j=0;j<3;j++) cout<<i*3+j<<"="<<ds[i*3+j].f<<"/"<<ds[i*3+j].top()<<endl;
     
    int ay[]={1,0,-1,0};
    int ax[]={0,1,0,-1};
     
    int ans=-1;
    fill_n(dp,40353607+1,32);
    //map<int,int> dp;
    queue<int> q;
 
     
    q.push(ds2i(ds));
    dp[ds2i(ds)]=0;
    while(!q.empty()){
      int p=q.front();q.pop();
      //cout<<p<<endl;
      if(dp[p]>=30) break;
      i2ds(p,ds);
      //cout<<tv(ds)<<endl;
      if(tv(ds)==en){
	ans=dp[p];
	break;
      }
      int y=-1,x=-1;
      for(int i=0;i<3;i++)
	for(int j=0;j<3;j++)
	  if(ds[i*3+j].f) y=i,x=j;
 
      //cout<<dp[p]<<":"<<y<<" "<<x<<endl;
       
      for(int k=0;k<4;k++){
	int ny=y+ay[k],nx=x+ax[k];
	//cout<<k<<"/"<<ny<<" "<<nx<<endl;
	if(ny<0||3<=ny||nx<0||3<=nx) continue;
	//cout<<k<<"/"<<ny<<" "<<nx<<endl;
	ds[ny*3+nx].roll(k);
	swap(ds[ny*3+nx],ds[y*3+x]);
 
	int h=ds2i(ds);
	if(dp[h]>30){
	  if(tv(ds)==en){
	    ans=dp[p]+1;
	    break;
	  }
	  dp[h]=dp[p]+1;
	  q.push(h);
	}
 
	swap(ds[ny*3+nx],ds[y*3+x]);
	ds[ny*3+nx].roll((k+2)%4);
      }
      if(ans>=0) break;
    }
    cout<<ans<<endl;
  }
  return 0;
}

Measured memory_bytes: 44300