#include<cstdio>
#include<vector>

#define rep(i,n) for(int i=0;i<(n);i++)

using namespace std;

class dice{
	char a[6];
public:
	dice(){}
	dice(char t,char l,char f,char r,char b,char d){
		a[0]=t; a[1]=l; a[2]=f;
		a[3]=r; a[4]=b; a[5]=d;
	}
	bool operator==(const dice &D)const{
		rep(i,6) if(a[i]!=D.a[i]) return false;
		return true;
	}
	char operator[](int i)const{ return a[i]; }
	char &operator[](int i){ return a[i]; }
	void rotx(){ char tmp=a[0]; a[0]=a[4]; a[4]=a[5]; a[5]=a[2]; a[2]=tmp; }
	void roty(){ char tmp=a[0]; a[0]=a[1]; a[1]=a[5]; a[5]=a[3]; a[3]=tmp; }
	void rotz(){ char tmp=a[1]; a[1]=a[4]; a[4]=a[3]; a[3]=a[2]; a[2]=tmp; }
};

vector<dice> get_all(dice D){
	vector<dice> res;
	rep(i,6){
		rep(j,4){
			res.push_back(D);
			D.rotz();
		}
		if(i%2==0) D.rotx();
		else       D.roty();
	}
	return res;
}

struct state{
	int y,x,id,pro; // y, x, dice direction, order progression
};

int main(){
	for(int w,h;scanf("%d%d",&w,&h),w;){
		char B[30][31];
		rep(i,h) scanf("%s",B[i]);
		char order[7];
		scanf("%s",order);

		vector<dice> D=get_all(dice('r','y','m','b','g','c'));

		static int d[30][30][24][7];
		rep(i,h) rep(j,w) rep(k,24) rep(l,7) d[i][j][k][l]=-1;

		int ans=-1;
		int head=0,tail=0;
		static state Q[30*30*24*7];
		rep(i,h) rep(j,w) if(B[i][j]=='#') {
			B[i][j]='w';
			d[i][j][0][0]=0;
			Q[tail++]=(state){i,j,0,0};
		}
		while(head<tail){
			int y=Q[head].y,x=Q[head].x,id=Q[head].id,pro=Q[head].pro; head++;

			if(pro==6){ ans=d[y][x][id][pro]; break; }

			// east rotation
			if(x+1<w){
				dice a=D[id];
				a.roty();
				if(B[y][x+1]=='w' || B[y][x+1]==order[pro] && B[y][x+1]==a[0]){
					int id2;
					rep(k,D.size()) if(a==D[k]) id2=k;
					int pro2=pro;
					if(B[y][x+1]==order[pro] && B[y][x+1]==a[0]) pro2++;
					if(d[y][x+1][id2][pro2]==-1){
						d[y][x+1][id2][pro2]=d[y][x][id][pro]+1;
						Q[tail++]=(state){y,x+1,id2,pro2};
					}
				}
			}
			// north rotation
			if(y>0){
				dice a=D[id];
				a.rotx(); a.rotx(); a.rotx();
				if(B[y-1][x]=='w' || B[y-1][x]==order[pro] && B[y-1][x]==a[0]){
					int id2;
					rep(k,D.size()) if(a==D[k]) id2=k;
					int pro2=pro;
					if(B[y-1][x]==order[pro] && B[y-1][x]==a[0]) pro2++;
					if(d[y-1][x][id2][pro2]==-1){
						d[y-1][x][id2][pro2]=d[y][x][id][pro]+1;
						Q[tail++]=(state){y-1,x,id2,pro2};
					}
				}
			}
			// west rotation
			if(x>0){
				dice a=D[id];
				a.roty(); a.roty(); a.roty();
				if(B[y][x-1]=='w' || B[y][x-1]==order[pro] && B[y][x-1]==a[0]){
					int id2;
					rep(k,D.size()) if(a==D[k]) id2=k;
					int pro2=pro;
					if(B[y][x-1]==order[pro] && B[y][x-1]==a[0]) pro2++;
					if(d[y][x-1][id2][pro2]==-1){
						d[y][x-1][id2][pro2]=d[y][x][id][pro]+1;
						Q[tail++]=(state){y,x-1,id2,pro2};
					}
				}
			}
			// south rotation
			if(y+1<h){
				dice a=D[id];
				a.rotx();
				if(B[y+1][x]=='w' || B[y+1][x]==order[pro] && B[y+1][x]==a[0]){
					int id2;
					rep(k,D.size()) if(a==D[k]) id2=k;
					int pro2=pro;
					if(B[y+1][x]==order[pro] && B[y+1][x]==a[0]) pro2++;
					if(d[y+1][x][id2][pro2]==-1){
						d[y+1][x][id2][pro2]=d[y][x][id][pro]+1;
						Q[tail++]=(state){y+1,x,id2,pro2};
					}
				}
			}
		}

		if(ans==-1) puts("unreachable"); else printf("%d\n",ans);
	}

	return 0;
}

Measured memory_bytes: 2648