#include <cstdio>
#include <iostream>
#include <vector>
#include <list>
#include <cmath>
#include <fstream>
#include <algorithm>
#include <string>
#include <queue>
#include <set>
#include <map>
#include <complex>
#include <iterator>
#include <cstdlib>
#include <cstring>
#include <sstream>

using namespace std;

#define EPS (1e-10)
#define EQ(a,b) (abs((a) - (b)) < EPS)
#define EQV(a,b) (EQ((a).real(),(b).real()) && EQ((a).imag(),(b).imag()))

typedef complex<double> P;
typedef pair<P,P> Edge;
typedef long long ll;

const double PI=4*atan(1.0);

void fast_stream(){
	std::ios_base::sync_with_stdio(0);
}
	
//#define RED_FILE

#ifdef RED_FILE
ifstream ifs("input.txt");
ofstream ofs("output.txt");
#define cin ifs
#define cout ofs
#endif

int h,w;
char field[31][31];
string ord;
int sy,sx;

class Dice{
public:
    char top;
    char bottom;
    char north;
    char south;
    char east;
    char west;

    Dice(){
        top='r';
        bottom='c';
        north='g';
        south='m';
        east='b';
        west='y';
    }
};

class Sit{
public:
    Dice d;
    int x,y;
    int dst;
};
const int dy[]={-1,0,0,1};
const int dx[]={0,-1,1,0};

int main(){
    map<char,int> mci;
    mci['r']=0;
    mci['c']=1;
    mci['g']=2;
    mci['m']=3;
    mci['b']=4;
    mci['y']=5;
    while(cin>>w>>h&&!(w==0&&h==0)){
        for(int i = 0; i < h; i++){
            for(int j = 0; j < w; j++){
                cin>>field[i][j];
                if(field[i][j]=='#'){
                    sy=i;
                    sx=j;
                    field[i][j]='w';
                }
            }
        }
        cin>>ord;
        queue<Sit> *prv=new queue<Sit>();
        queue<Sit> *nxt=new queue<Sit>();
        Sit sa;
        sa.d=Dice();
        sa.x=sx;
        sa.y=sy;
        sa.dst=0;
        prv->push(sa);
        bool d[6][6][6][31][31];
        memset(d,0,sizeof(d));
        bool ok=false;
        int cnt=0;
        while(prv->size()){
            while(prv->size()){
                Sit st=prv->front();
                prv->pop();
                d[st.dst][mci[st.d.top]][mci[st.d.north]][st.y][st.x]=true;
                int ndist=st.dst;
                if(ord[st.dst]==st.d.top&&field[st.y][st.x]==st.d.top){
                    ndist++;
                    if(ndist==ord.size()){
                        ok=true;
                        break;
                    }
                }
                // ツ四ツ陛サツ古シツづ鳴嘉アツ転ツ暗堋督ョ
                for(int i = 0; i < 4; i++){
                    int ny=st.y+dy[i];
                    int nx=st.x+dx[i];
                    if(!(ny>=0&&nx>=0&&ny<h&&nx<w)||field[ny][nx]=='k')
                        continue;
                    // north
                    Dice nd=st.d;
                    if(i==0){
                        char tmp=nd.top;
                        nd.top=nd.south;
                        nd.south=nd.bottom;
                        nd.bottom=nd.north;
                        nd.north=tmp;
                    }
                    else if(i==2){
                        char tmp=nd.top;
                        nd.top=nd.west;
                        nd.west=nd.bottom;
                        nd.bottom=nd.east;
                        nd.east=tmp;
                    }
                    else if(i==1){
                        char tmp=nd.top;
                        nd.top=nd.east;
                        nd.east=nd.bottom;
                        nd.bottom=nd.west;
                        nd.west=tmp;
                    }
                    else{
                        char tmp=nd.top;
                        nd.top=nd.north;
                        nd.north=nd.bottom;
                        nd.bottom=nd.south;
                        nd.south=tmp;
                    }
                    // ツ篠淞づ個湘ェツ渉環つェツづ慊つセツ津環嘉淞催渉づ敖づづ按つ「
                    if(!d[ndist][mci[nd.top]][mci[nd.north]][ny][nx]){
                        if(field[ny][nx]=='w'){
                        }
                        else{
                            if(nd.top==ord[ndist]&&field[ny][nx]==nd.top){
                            }
                            // ツ篠淞づ個マツスツつェツ色ツ個篠づ個湘ェツ債づ債、ordツづ個色ツづトツッツプツづ個色ツつェツ督ッツつカツづ可づ按づァツづ按つッツづェツづ篠津環嘉敖つキツづゥツつアツづつェツづつォツづ按つ「
                            else
                                continue;
                        }
                        d[ndist][mci[nd.top]][mci[nd.north]][ny][nx]=true;
                        Sit ns;
                        ns.d=nd;
                        ns.dst=ndist;
                        ns.x=nx;
                        ns.y=ny;
                        nxt->push(ns);
                    }
                }
            }
            if(ok)break;
            cnt++;
            swap(prv,nxt);
        }
        delete prv;
        delete nxt;

        if(ok)
            cout<<cnt<<endl;
        else
            cout<<"unreachable"<<endl;
    }

    return 0;
}

Measured memory_bytes: 1156