#include "bits/stdc++.h"
#include<unordered_map>
#pragma warning(disable:4996)
using namespace std;
const int dx[4] = { -1,0,1,0 };
const int dy[4] = { 0,1,0,-1 };
map<char, int>mp;
vector<vector<int>>field;

struct Dice {
	int tp;
	int bo;
	int no;
	int so;
	int ea;
	int we;
	Dice(vector<int>pips_) {

	}
	Dice() {
		tp = 1;
		bo = 4;
		no = 2;
		so = 5;
		ea = 3;
		we = 6;
	}
	enum R_Way{
		R_Left,
		R_Front,
		R_Right,
		R_Back,
		
		R_Dummy,
	};
	int rotate(const R_Way way) {
		switch (way) {
		case R_Right: {
			int c = tp;
			tp = we;
			we = bo;
			bo = ea;
			ea = c;
		}
					 break;
		case R_Back: {
			int c = tp;
			tp = so;
			so = bo;
			bo = no;
			no = c;
		}
					  break;
		case R_Left: {
			int c = tp;
			tp = ea;
			ea = bo;
			bo = we;
			we = c;
		}
					  break;
		case R_Front: {
			int c = tp;
			tp = no;
			no = bo;
			bo = so;
			so = c;
		}
					 break;
		default:
			assert(false);
		}
		return tp;
	}
	int rotate(const int way) {
		return rotate(static_cast<R_Way>(way));
	}
	int hash()const {
		return tp + we * 6 + no * 36;
	}
};

struct aa {
	Dice di;
	int y;
	int x;
	int push;
	int time;
};

class Compare {
public:
	//aaが昇順に並ぶ
	bool operator()(const aa&l, const aa&r) {
		return l.time> r.time;
	}
};

int memo[300][32][32][7];

int main() {
	mp['k'] = 0;
	mp['r'] = 1;
	mp['g'] = 2;
	mp['b'] = 3;
	mp['c'] = 4;
	mp['m'] = 5;
	mp['y'] = 6;
	mp['w'] = 7;

	while (1) {
		for (int i = 0; i < 300; ++i) {
			for (int j = 0; j < 32; ++j) {
				for (int k = 0; k < 32; ++k) {
					for (int l = 0; l < 7; ++l) {
						memo[i][j][k][l] = 99999999;
					}
				}
			}
		}
		field.clear();
		int W, H; cin >> W >> H;
		if (!W)break;
		field.resize(H + 2);
		field[0].resize(W + 2);
		int sx, sy;
		for (int i = 0; i < H; ++i) {
			string st; cin >> st;
			field[i + 1].push_back(0);
			for (int j = 0; j < W; ++j) {
				if (st[j] == '#') {
					sx = j + 1;
					sy = i + 1;
					st[j] = 'w';
				}
				field[i + 1].push_back(mp[st[j]]);
			}
			field[i + 1].push_back(0);
		}
		field[H+1].resize(W + 2);
		string fst; cin >> fst;
		vector<int>perms;
		for (int i = 0; i < 6; ++i) {
			perms.push_back(mp[fst[i]]);
		}

		Dice dice;

		priority_queue<aa, vector<aa>, Compare>que;
		que.push(aa{ dice,sy,sx,0,0 });
		memo[dice.hash()][sy][sx][0] = 0;

		string ans = "unreachable";
		while (!que.empty()) {
			aa atop(que.top());
			que.pop();
			if (atop.push == 6) {
				ans = to_string(atop.time);
				break;
			}
			for (int i = 0; i < 4; ++i) {
				const int ny = atop.y + dy[i];
				const int nx = atop.x + dx[i];
				const int ntime = atop.time + 1;
				Dice ndice(atop.di);
				ndice.rotate(i);
				if (field[ny][nx] == 7) {
					if (memo[ndice.hash()][ny][nx][atop.push]>ntime) {
						memo[ndice.hash()][ny][nx][atop.push] = ntime;
						que.push(aa{ ndice,ny,nx,atop.push,ntime });
					}
				}
				else if (field[ny][nx]) {
					if (ndice.tp == field[ny][nx]&&field[ny][nx]==perms[atop.push]) {
						if (memo[ndice.hash()][ny][nx][atop.push+1]>ntime) {
							memo[ndice.hash()][ny][nx][atop.push+1] = ntime;
							que.push(aa{ ndice,ny,nx,atop.push+1,ntime });
						}
					}
				}
			}
		}
		cout << ans << endl;
	}
	
	return 0;
}

Measured memory_bytes: 11768