#include <bits/stdc++.h>

#define DEBUG(x) cerr << #x << "=" << x << endl
#define DUMP2(x, y) cerr<<"("<<#x<<", "<<#y<<") = ("<<x<<", "<<y<<")"<< endl
#define BINARY(x) static_cast<bitset<16> >(x)
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define REP(i,m,n) for (int i=m;i<(int)(n);i++)
#define if_range(x, y, w, h) if (0<=(int)(x) && (int)(x)<(int)(w) && 0<=(int)(y) && (int)(y)<(int)(h))
#define is_in(x, y, w, h) (0<=(int)(x) && (int)(x)<(int)(w) && 0<=(int)(y) && (int)(y)<(int)(h))
#define ALL(a) (a).begin(),(a).end()

using namespace std;
typedef long long ll;
typedef vector<vector<int> > VVI;
const int INF = 1e9;
typedef pair<int, int> PII;

enum {RED, CYAN, GREEN, MAGENTA, BLUE, YELLOW, WHITE};

enum FACE {TOP, FRONT, RIGHT, LEFT, BACK, BOTTOM}; 
enum MOVE {TOP_TO_FRONT, TOP_TO_RIGHT, TOP_TO_LEFT, TOP_TO_BACK, 
        FRONT_TO_LEFT, FRONT_TO_RIGHT};

class Dice {
private:
    vector<int> num, i_num;

public:
    const int tb[6][4] = {
        {FRONT, TOP, BACK, BOTTOM},
        {RIGHT, TOP, LEFT, BOTTOM},
        {LEFT, TOP, RIGHT, BOTTOM},
        {BACK, TOP, FRONT, BOTTOM},
        {LEFT, FRONT, RIGHT, BACK},
        {RIGHT, FRONT, LEFT, BACK}
    };

    Dice() 
    { 
        num.assign(6, -1);
        i_num.resize(6);
        // i_num = {RED, MAGENTA, BLUE, YELLOW, GREEN, CYAN};
        i_num = {0, 3, 4, 5, 2, 1};
    }

    Dice(int t, int f) 
    {
        num.resize(6), i_num.resize(6);
        // i_num = {RED, MAGENTA, BLUE, YELLOW, GREEN, CYAN};
        i_num = {0, 3, 4, 5, 2, 1};
        roll(t, f);
    }

    void set_identity(vector<int> i) { num = i_num = i; }
    int get(FACE f) { return num[f]; }

    void rotate(int move)
    {
        int tmp = num[tb[move][0]];
        rep(i, 3) num[tb[move][i]] = num[tb[move][i+1]];
        num[tb[move][3]] = tmp;
    }

    bool roll(int t, int f)
    {
        num = i_num;
        for (int j=0; j<6; j++) {
            for (int i=0; i<4; i++) {
                if (num[0] == t && num[1] == f) return true;
                rotate(FRONT_TO_RIGHT);
            }
            if (j%2) rotate(TOP_TO_FRONT);
            else rotate(TOP_TO_RIGHT);
            if (num[0] == t && num[1] == f) return true; // 必要?
        }
        return false;
    }

    void print()
    {
        cerr << "[" << num[TOP] << ", " << num[FRONT] << ", " 
            << num[RIGHT] << "]" << endl;
    };

    bool operator == (const Dice &other) { return num == other.num; }
};

struct State {
    int x, y, t, f, n, dist;
};


int W, H;
bool in_range(int x, int y)
{
    return (0 <= x && x < W && 0 <= y && y < H);
}


int dx[4]={0, -1, 1, 0}, dy[4]={-1, 0, 0, 1};
int dr[4] = {TOP_TO_BACK, TOP_TO_LEFT, TOP_TO_RIGHT, TOP_TO_FRONT};

int to_int(char c)
{
    if (c == 'r') return RED;
    if (c == 'g') return GREEN;
    if (c == 'b') return BLUE;
    if (c == 'c') return CYAN;
    if (c == 'm') return MAGENTA;
    if (c == 'y') return YELLOW;
    if (c == 'w') return WHITE;
    return -1;
}

int main()
{
    while (cin >> W >> H, W) {
        vector<string> board(H);
        rep(i, H) cin >> board[i];

        int sx, sy;
        rep(y, H) rep(x, W) {
            if (board[y][x] == '#') {
                sx = x, sy = y;
                board[y][x] = 'w';
            }
        }
        string V; cin >> V;

        queue<State> Q;
        bool vis[30][30][6][6][6] = {};
        Q.push({sx, sy, RED, MAGENTA, 0, 0});
        vis[sx][sy][RED][MAGENTA][0] = true;

        bool ok = false;
        while (Q.size()) {
            // cerr << "-----------" << endl;
            State s = Q.front(); Q.pop();

            if (s.n == 6) {
                ok = true;
                cout << s.dist << endl;
                break;
            }

            rep(i, 4) {
                int nx = s.x + dx[i], ny = s.y + dy[i];
                Dice tmp(s.t, s.f);

                if (!in_range(nx, ny)) continue;
                tmp.rotate(dr[i]);
                
                char ncolor = board[ny][nx];
                if (ncolor == 'w' || (ncolor == V[s.n] && tmp.get(TOP) == to_int(ncolor))) {
                    int nn = (ncolor != 'w' ? s.n+1 : s.n);
                    if (!vis[nx][ny][tmp.get(TOP)][tmp.get(FRONT)][nn]) {
                        vis[nx][ny][tmp.get(TOP)][tmp.get(FRONT)][nn] = true;
                        Q.push({nx, ny, tmp.get(TOP), tmp.get(FRONT), nn, s.dist+1});
                    }
                }
            }
        }
        if (!ok) cout << "unreachable" << endl;
    }
}

Measured memory_bytes: 3356