#include <iostream>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#include <numeric>
#include <climits>
#include <cfloat>
using namespace std;

class Dice
{
public:
    vector<int> pip; // ì¼kãºÌÚ
    Dice(){
        pip.assign(6, -1);
    }
    void roll(int d){ // ì¼kE¶Éñ]
        int dir[][4] = {{4,2,5,0},{4,3,5,1},{4,0,5,2},{4,1,5,3},{0,3,2,1},{0,1,2,3}};
        int tmp = pip[dir[d][0]];
        for(int i=0; i<3; ++i)
            pip[dir[d][i]] = pip[dir[d][i+1]];
        pip[dir[d][3]] = tmp;
    }
};

class Data
{
public:
    int y, x, a;
    Dice d;
    Data(int y0, int x0, int a0, Dice& d0){
        y = y0;
        x = x0;
        a = a0;
        d = d0;
    }
    bool operator<(const Data& other) const{
        if(y != other.y)
            return y < other.y;
        if(x != other.x)
            return x < other.x;
        if(a != other.a)
            return a < other.a;
        return d.pip < other.d.pip;
    }
};

int dy[] = {0, 1, 0, -1};
int dx[] = {1, 0, -1, 0};

int main()
{
    Dice dice0;
    dice0.pip[0] = 'b';
    dice0.pip[1] = 'm';
    dice0.pip[2] = 'y';
    dice0.pip[3] = 'g';
    dice0.pip[4] = 'r';
    dice0.pip[5] = 'c';

    for(;;){
        int w, d;
        cin >> w >> d;
        if(w == 0)
            return 0;

        vector<string> grid(d+2, string(w+2, 'k'));
        int sy, sx;
        for(int i=1; i<=d; ++i){
            for(int j=1; j<=w; ++j){
                cin >> grid[i][j];
                if(grid[i][j] == '#'){
                    sy = i;
                    sx = j;
                    grid[i][j] = 'w';
                }
            }
        }

        string v;
        cin >> v;

        set<Data> history;
        history.insert(Data(sy, sx, 0, dice0));
        queue<pair<Data, int> > q;
        q.push(make_pair(Data(sy, sx, 0, dice0), 0));
        bool ok = false;
        while(!q.empty()){
            int y0 = q.front().first.y;
            int x0 = q.front().first.x;
            int a0 = q.front().first.a;
            Dice d0 = q.front().first.d;
            int c0 = q.front().second;
            q.pop();

            for(int i=0; i<4; ++i){
                int y = y0 + dy[i];
                int x = x0 + dx[i];
                int a = a0;
                Dice d = d0;
                d.roll(i);
                int c = c0 + 1;

                if(grid[y][x] == 'k')
                    continue;
                if(grid[y][x] != 'w'){
                    if(grid[y][x] != v[a] || grid[y][x] != d.pip[4])
                        continue;
                    ++ a;
                }
                if(history.find(Data(y, x, a, d)) != history.end())
                    continue;

                if(a == 6){
                    cout << c << endl;
                    ok = true;
                    break;
                }

                history.insert(Data(y, x, a, d));
                q.push(make_pair(Data(y, x, a, d), c));
            }

            if(ok)
                break;
        }

        if(!ok)
            cout << "unreachable" << endl;
    }
}

Measured memory_bytes: 0