#include <iostream>
#include <tuple>
#include <queue>
using namespace std;
using T=tuple<int,int,int,int>; 
//y,x,hand(前:0,右前:1,右:2,右後ろ:3),dir(0:u,1:r,2:d,3:l)


int dir_x[8]={0,1,1,1,0,-1,-1,-1};
int dir_y[8]={-1,-1,0,1,1,1,0,-1};
char board[53][52];
bool visited[53][52][4][8];

bool isWall(int y, int x, int dir){
    dir=(dir+8)%8;
    return board[y+dir_y[dir]][x+dir_x[dir]]=='#';
}

int main(){
    int N,M;
    cin>>N>>M;
    fill(board[0],board[52],'#');
    fill(visited[0][0][0],visited[52][0][0],false);
    queue<T> Q;

    for(int i=1;i<=N;i++){
        for(int j=1;j<=M;j++){
            cin>>board[i][j];
            switch(board[i][j]){
                case '^':
                    Q.emplace(i,j,2,0);
                    visited[i][j][2][0]=true;
                    break;
                case '>':
                    Q.emplace(i,j,2,2);
                    visited[i][j][2][2]=true;
                    break;
                case 'v':
                    Q.emplace(i,j,2,4);
                    visited[i][j][2][4]=true;
                    break;
                case '<':
                    Q.emplace(i,j,2,6);
                    visited[i][j][2][6]=true;
                    break;
            }
        }
    }
    /*
    for(int i=0;i<N+2;i++){
        for(int j=0;j<M+2;j++){
            cout<<board[i][j];
        }
        cout<<endl;
    }*/
    while(!Q.empty()){
        int y,x,hand,dir;
        tie(y,x,hand,dir)=Q.front(); Q.pop();
        // cout<<y<<' '<<x<<' '<<hand<<' '<<dir<<endl;
        // cout<<board[y+dir_y[(hand+dir)%8]][x+dir_x[(hand+dir)%8]]<<endl;
        if(board[y][x]=='G'){
            int ans =0;
            for(int i=1;i<=N;i++){
                for(int j=1;j<=M;j++){
                    bool v=false;
                    for(int h=0;h<4;h++){
                        for(int d=0;d<8;d+=2){
                            v|=visited[i][j][h][d];
                        }
                    }
                    ans+=v;
                }
            }
            cout<<ans<<endl;
            return 0;
        }
        //前に進む
        if(!isWall(y,x,dir)&&1<=hand&&hand<=2&&!visited[y+dir_y[dir]][x+dir_x[dir]][hand+1][dir]){
            Q.emplace(y+dir_y[dir],x+dir_x[dir],hand+1,dir);
            visited[y+dir_y[dir]][x+dir_x[dir]][hand+1][dir]=true;
        }
        //右に90度転換
        if(hand>=2&&!visited[y][x][hand-2][(dir+2)%8]){
            Q.emplace(y,x,hand-2,(dir+2)%8);
            visited[y][x][hand-2][(dir+2)%8]=true;
        }
        //左に90度転換
        if(hand<=1&&!visited[y][x][hand+2][(dir+6)%8]){
            Q.emplace(y,x,hand+2,(dir+6)%8);
            visited[y][x][hand+2][(dir+6)%8]=true;
        }
        //右手が接するマスを変える
        switch(hand){
            case 0:
                if(isWall(y,x,dir+1)&&!visited[y][x][1][dir]){
                    Q.emplace(y,x,1,dir);
                    visited[y][x][1][dir]=true;
                }
                if(isWall(y,x,dir+2)&&!visited[y][x][2][dir]){
                    Q.emplace(y,x,2,dir);
                    visited[y][x][2][dir]=true;
                }
                break;
            case 1:
                if(isWall(y,x,dir+0)&&!visited[y][x][0][dir]){
                    Q.emplace(y,x,0,dir);
                    visited[y][x][0][dir]=true;
                }
                if(isWall(y,x,dir+2)&&!visited[y][x][2][dir]){
                    Q.emplace(y,x,2,dir);
                    visited[y][x][2][dir]=true;
                }
                break;
            case 2:
                if(isWall(y,x,dir+0)&&!visited[y][x][0][dir]){
                    Q.emplace(y,x,0,dir);
                    visited[y][x][0][dir]=true;
                }
                if(isWall(y,x,dir+1)&&!visited[y][x][1][dir]){
                    Q.emplace(y,x,1,dir);
                    visited[y][x][1][dir]=true;
                }
                break;
            case 3:
                if(isWall(y,x,dir+2)&&!visited[y][x][2][dir]){
                    Q.emplace(y,x,2,dir);
                    visited[y][x][2][dir]=true;
                }
                break;
        }
    }
    cout<<-1<<endl;
    return 0;
}


Measured memory_bytes: 3260