#include<bits/stdc++.h>
using namespace std;
#define MAX_N 50
#define MAX_M 50
int di[4] = {0, 1, 0, -1};
int dj[4] = {1, 0, -1, 0};

void show(int nows, int nowi, int nowj, vector<vector<bool> > a){

    for(int i = 1; i <= 2; i++){
        for(int j = 1; j <= 3; j++){
            if(i == nowi && j == nowj){
                if(nows == 0) cout << '>';
                else if(nows == 1) cout << 'v';
                else if(nows == 2) cout << '<';
                else cout << '^';
            }else{
                if(a[i][j]) cout << '.';
                else cout << '#';
            }
        }
        cout << endl;
    }
}

int main(){

    int n, m; cin >> n >> m;
    vector<vector<bool> > a(n + 2, vector<bool> (m + 2, false));
    int si, sj, gi, gj, s;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            char c; cin >> c;
            if(c == '#') continue;

            a[i][j] = true;
            if(c == 'G'){
                gi = i;
                gj = j;
            }else if(c == '>'){
                si = i;
                sj = j;
                s = 0;
            }else if(c == 'v'){
                si = i;
                sj = j;
                s = 1;
            }else if(c == '<'){
                si = i;
                sj = j;
                s = 2;
            }else if(c == '^'){
                si = i;
                sj = j;
                s = 3;
            }

        }
    }

    bool g[53][53][4] = {};           //状態の管理

    g[si][sj][s] = true;

    queue<pair<int, pair<int, int> > > wait;       //向き　座標
    wait.push(make_pair(s, make_pair(si, sj)));
    
    int ans = 0;

    while(!wait.empty()){    //キュー画空になるまで
        //キューの先頭要素を取り出す
        int nows = wait.front().first;
        int nowi = wait.front().second.first;
        int nowj = wait.front().second.second;

        //cout << nows << " " << nowi << " " << nowj << endl;


        wait.pop();

        //ゴールにたどり着いたらそのコストが答え
        if(nowi == gi && nowj == gj){
            
            for(int i = 1; i <= n; i++){
                for(int j = 1; j <= m; j++){
                    if(g[i][j][0] || g[i][j][1] || g[i][j][2] || g[i][j][3]){
                        ans ++;
                        //cout << i << " " << j << endl;
                    }
                }
            }
            break;
        }


        int migi_s = (nows + 1) % 4;
        int hidari_s = (nows + 3) % 4;
        int migi_i = nowi + di[migi_s];
        int migi_j = nowj + dj[migi_s];
        int next_i = nowi + di[nows];
        int next_j = nowj + dj[nows];

        //cout << g[4][4][3] << endl;
        //cout << nows << " " << nowi << " " << nowj << "  " << migi_i << " " << migi_j << "  " << next_i << " " << next_j << endl;
        //show(nows, nowi, nowj, a);
        //cout << endl;
        //cout << a[migi_i][migi_j] << " " << a[next_i][next_j] << " " << g[next_i][next_j][s] << endl;
        /*if(nows == 3){
            cout << a[next_i][next_j] << endl;
            cout << nowi << " " << s << " " << di[s] << " " << next_i << " " << endl;
        }*/

        if(!a[migi_i][migi_j] && a[next_i][next_j] && !g[next_i][next_j][nows]){
            wait.push({nows, {next_i, next_j}});
            g[next_i][next_j][nows] = true;
        }

        //cout << 95 << endl;
        
        //if(nows == 0 && nowi == 4 && nowj == 4) cout <<a[migi_i][migi_j] << hidari_s<<g[nowi][nowj][hidari_s]<< endl;

        if(!a[migi_i][migi_j] && !a[next_i][next_j] && !g[nowi][nowj][hidari_s]){
            wait.push({hidari_s, {nowi, nowj}});
            g[nowi][nowj][hidari_s] = true;
        }

        //cout << 102 << endl;
        
        
        //if(nows == 2 && nowi == 3 && nowj == 3) cout << g[]

        if(!a[migi_i - di[nows]][migi_j - dj[nows]] && a[migi_i][migi_j] && !g[migi_i][migi_j][migi_s]){
            wait.push({migi_s, {migi_i, migi_j}});
            g[migi_i][migi_j][migi_s] = true;
        }

        //cout << 109 << endl;

    }

    if(ans > 0) cout << ans << endl;
    else cout << -1 << endl;
    return 0;
}


Measured memory_bytes: 3164