#include<bits/stdc++.h>
using namespace std;

void ra(string &s){
  char tmp=s[0];
  s[0]=s[1];
  s[1]=s[5];
  s[5]=s[3];
  s[3]=tmp;
}

void rb(string &s){
  char tmp=s[0];
  s[0]=s[4];
  s[4]=s[5];
  s[5]=s[2];
  s[2]=tmp;
}

void rc(string &s){
  char tmp=s[1];
  s[1]=s[2];
  s[2]=s[3];
  s[3]=s[4];
  s[4]=tmp;
}

bool eq(string &a,string &b){
  for(int i=0;i<6;i++){
    if(i&1)ra(a);
    else rb(a);
    for(int j=0;j<4;j++){
      rc(a);
      if(a==b)return true;
    }
  }
  return false;
}

struct state{
  int y,x,c;
  string die;
};

int dy[]={-1,0,1,0},dx[]={0,1,0,-1};
string str;
string tmp="rmbgyc";
int H,W,si,sj;
char t[30][30];
map<string,int> d[30][30][7];

void solve(){
  queue< state > Q;
  Q.push((state){si,sj,0,tmp});
  while(!Q.empty()){
    state s=Q.front();Q.pop();
    int cost=d[s.y][s.x][s.c][s.die];
    
    if(s.c==6){cout<<cost<<endl;return;}
    
    for(int i=0;i<4;i++){
      int ny=s.y+dy[i],nx=s.x+dx[i];
      int nc=s.c;
      string ndie=s.die;
      if(ny<0||nx<0||H<=ny||W<=nx)continue;
      
      if(i==0)ra(ndie);
      if(i==1)rb(ndie);
      if(i==2)ra(ndie),ra(ndie),ra(ndie);
      if(i==3)rb(ndie),rb(ndie),rb(ndie);
      
      if(t[ny][nx]!='w'){
        if(t[ny][nx]!=ndie[0])continue;
        if(t[ny][nx]!=str[s.c])continue;
        nc++;
      }

      if(d[ny][nx][nc].count(ndie))continue;
      d[ny][nx][nc][ndie]=cost+1;
      Q.push((state){ny,nx,nc,ndie});
    }
  }
  cout<<"unreachable"<<endl;
}

void init(){
  for(int i=0;i<30;i++)
    for(int j=0;j<30;j++)
      for(int k=0;k<7;k++)
        d[i][j][k].clear();
}

int main(){
  while(1){
    init();
    cin>>W>>H;
    if(W==0&&H==0)break;
    
    
    for(int i=0;i<H;i++){
      cin>>str;
      for(int j=0;j<W;j++){
        t[i][j]=str[j];
        if(t[i][j]=='#'){
          t[i][j]='w';
          si=i,sj=j;
        }
      }
    }
    cin>>str;
    solve();
  }
}