#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAXN=(int)1e9;
const int h[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

struct State 
{ 
	int x,y,succ,ct,cn,ce; 
	State(int xx,int yy,int ss,int cct,int ccn,int cce)
	{
		x=xx;y=yy;succ=ss;ct=cct;cn=ccn;ce=cce;
	};
	State(){};
} q[5001000];

int f[33][33][7][7][7],colarr[7],en,n,m,ans,order[7];
char str[33][33],chr[7];
bool inl[33][33][7][7][7];

void freshsta(State &a,int c[7])
{
	a.ct=c[1];
	a.cn=c[3];
	a.ce=c[5];
}

void change(int c[7],int c1,int c2,int c3,int c4)
{
	int tmp;
	tmp=c[c1];
	c[c1]=c[c4];
	c[c4]=c[c3];
	c[c3]=c[c2];
	c[c2]=tmp;
}

void getarr(State a,int c[7])
{
	c[1]=a.ct;
	c[3]=a.cn;
	c[5]=a.ce;
	if (a.ct%2==1) c[2]=a.ct+1;
	else c[2]=a.ct-1;
	if (a.cn%2==1) c[4]=a.cn+1;
	else c[4]=a.cn-1;
	if (a.ce%2==1) c[6]=a.ce+1;
	else c[6]=a.ce-1;
}

State trans(State a,int c)
{
	State ret=a;
	ret.x+=h[c][0];ret.y+=h[c][1];
	getarr(a,colarr);
	if (c==0)
	{
		change(colarr,1,5,2,6);
	}else if (c==1)
	{
		change(colarr,1,4,2,3);
	}else if (c==2)
	{
		change(colarr,1,6,2,5);
	}else
	{
		change(colarr,1,3,2,4);
	}
	freshsta(ret,colarr);
	return ret;
}

void fresh(State sta,int va)
{
	if (sta.x<=0 || sta.x>n || sta.y<=0 || sta.y>m || str[sta.x][sta.y]=='k') return;
	
	if (str[sta.x][sta.y]=='w')
	{
		if (va<f[sta.x][sta.y][sta.succ][sta.ct][sta.cn])
		{
			f[sta.x][sta.y][sta.succ][sta.ct][sta.cn]=va;
			if (!inl[sta.x][sta.y][sta.succ][sta.ct][sta.cn])
			{
				q[++en]=sta;
				inl[sta.x][sta.y][sta.succ][sta.ct][sta.cn]=true;
			}
		}
	} 
	if ((str[sta.x][sta.y]==chr[sta.succ] && order[sta.succ]==sta.ct))
	{
		sta.succ++;
		if (sta.succ==6) { ans=min(va,ans);return; }
		if (va<f[sta.x][sta.y][sta.succ][sta.ct][sta.cn])
		{
			f[sta.x][sta.y][sta.succ][sta.ct][sta.cn]=va;
			if (!inl[sta.x][sta.y][sta.succ][sta.ct][sta.cn])
			{
				q[++en]=sta;
				inl[sta.x][sta.y][sta.succ][sta.ct][sta.cn]=true;
			}
		}
	}
}

int turn(char c)
{
	if (c=='r') return 1;
	if (c=='c') return 2;
	if (c=='g') return 3;
	if (c=='m') return 4;
	if (c=='b') return 5;
	if (c=='y') return 6;
}

int main()
{
	while (scanf("%d%d",&n,&m)!=EOF && (n||m))
	{
		swap(n,m);
		for (int i=1;i<=n;i++) scanf("%s",&str[i][1]);
		scanf("%s",chr);
		for (int i=0;i<6;i++) order[i]=turn(chr[i]);
		en=0;
		memset(f,127,sizeof(f));
		ans=MAXN;
		for (int i=1;i<=n;i++)
		{
			for (int j=1;j<=m;j++)
			{
				if (str[i][j]=='#')
				{
					str[i][j]='w';
					q[++en]=State(i,j,0,1,3,5);
					f[i][j][0][1][3]=0;
					inl[i][j][0][1][3]=true;
				}
			}
		}
		for (int st=1;st<=en;st++)
		{
			int x=q[st].x,y=q[st].y;
			for (int i=0;i<4;i++)
			{
				State tmp=trans(q[st],i);
				fresh(tmp,f[x][y][q[st].succ][q[st].ct][q[st].cn]+1);
			}
			inl[x][y][q[st].succ][q[st].ct][q[st].cn]=false;
		}
		if (ans<MAXN) printf("%d\n",ans);
		else printf("unreachable\n");
	}
	
	return 0;
}