#include <bits/stdc++.h>
using namespace std;
#define SZ(x) (int)(x.size())
#define REP(i, n) for(int i=0;i<(n);++i)
#define FOR(i, a, b) for(int i=(a);i<(b);++i)
#define RREP(i, n) for(int i=(int)(n)-1;i>=0;--i)
#define RFOR(i, a, b) for(int i=(int)(b)-1;i>=(a);--i)
#define ALL(a) a.begin(),a.end()
#define DUMP(x) cerr<<#x<<" = "<<(x)<<endl
#define DEBUG(x) cerr<<#x<<" = "<<(x)<<" (L"<<__LINE__<<")"<< endl;
using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using P = pair<int, int>;
const double eps = 1e-8;
const ll MOD = 1000000007;
const int INF = INT_MAX / 2;
const ll LINF = LLONG_MAX / 2;
template <typename T1, typename T2>
bool chmax(T1 &a, const T2 &b) {
    if (a < b) { a = b; return true; }
    return false;
}
template <typename T1, typename T2>
bool chmin(T1 &a, const T2 &b) {
    if (a > b) { a = b; return true; }
    return false;
}
template<typename T1, typename T2>
ostream &operator<<(ostream &os, const map<T1, T2> &mp);
template<typename T>
ostream &operator<<(ostream &os, const vector<T> &v);

template<typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
    os << "(" << p.first << ":" << p.second << ")";
    return os;
}
template<typename T1, typename T2>
ostream &operator<<(ostream &os, const map<T1, T2> &mp) {
    os << "{";
    int a = 0;
    for (auto &tp : mp) {
        if (a) os << ", "; a = 1;
        os << tp;
    }
    return os << "}";
}
template<typename T>
ostream &operator<<(ostream &os, const vector<T> &v) {
    os << "[";
    REP(i, SZ(v)) {
        if (i) os << ", ";
        os << v[i];
    }
    return os << "]";
}


int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);

    for (;;) {
        int W, H; cin >> W >> H;
        if (W == 0) break;
        vector<string> S(H);
        int si, sj;
        REP(i, H) {
            cin >> S[i];
            REP(j, W) {
                if (S[i][j] == '#') {
                    si = i, sj = j;
                    S[i][j] = 'w';
                }
            }
        }
        string path; cin >> path;

        using cube_t = array<char,6>;
        using point = pair<int,int>;
        using data = tuple<point,cube_t,int>;
        queue<data> que;
        map<data,int> dist;
        point sp = {si, sj};
        cube_t sc = {'r', 'm', 'b', 'g', 'y', 'c'};
        que.emplace(sp, sc, 0);
        dist[que.front()] = 0;

        int ans = -1;
        while (!que.empty()) {
            cube_t cube;
            point p;
            int idx;
            tie(p, cube, idx) = que.front();
            int d = dist[que.front()];
            que.pop();
            if (idx == path.size()) {
                ans = d;
                break;
            }

            int i, j; tie(i, j) = p;

            vector<cube_t> cubes(4);
            {
                cube_t c = cube;
                char buff = c[0];
                c[0] = c[2], c[2] = c[5], c[5] = c[4], c[4] = buff;
                cubes[0] = c;
            }
            {
                cube_t c = cube;
                char buff = c[0];
                c[0] = c[4], c[4] = c[5], c[5] = c[2], c[2] = buff;
                cubes[1] = c;
            }
            {
                cube_t c = cube;
                char buff = c[0];
                c[0] = c[3], c[3] = c[5], c[5] = c[1], c[1] = buff;
                cubes[2] = c;
            }
            {
                cube_t c = cube;
                char buff = c[0];
                c[0] = c[1], c[1] = c[5], c[5] = c[3], c[3] = buff;
                cubes[3] = c;
            }
            vector<int> ni{i, i, i+1, i-1};
            vector<int> nj{j-1, j+1, j, j};

            REP(k, 4) {
                if (0 <= ni[k] and ni[k] < H and 0 <= nj[k] and nj[k] < W) {
                    point q = {ni[k], nj[k]};
                    cube_t c = cubes[k];
                    if (S[ni[k]][nj[k]] == 'w') {
                        auto tp = make_tuple(q, c, idx);
                        if (dist.count(tp) == 0) {
                            dist[tp] = d + 1;
                            que.push(tp);
                        }
                    }
                    if (S[ni[k]][nj[k]] == c[0] and path[idx] == c[0]) {
                        auto tp = make_tuple(q, c, idx + 1);
                        if (dist.count(tp) == 0) {
                            dist[tp] = d + 1;
                            que.push(tp);
                        }
                    }
                }
            }
        }
        if (ans == -1) cout << "unreachable" << endl;
        else cout << ans << endl;
    }

    return 0;
}




Measured memory_bytes: 7196