#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define all(x) (x).begin(),(x).end()
const int mod=1000000007,MAX=63,INF=1<<30;
char S[MAX][MAX];
int H,W,sh,sw,sdir,shand,gh,gw,gdir,ghand;
bool visited[MAX][MAX][4][4];

struct point{
    int h;
    int w;
    int dir;
    int hand;
};

point par[MAX][MAX][4][4];

vector<point> G[MAX][MAX][4][4];
vector<int> dh={0,-1,0,1},dw={1,0,-1,0};

string U=">^<v";

bool BFS(){
    queue<point> Q;
    Q.push({sh,sw,sdir,shand});
    
    while(!Q.empty()){
        point p=Q.front();Q.pop();
        
        for(point to:G[p.h][p.w][p.dir][p.hand]){
            if(visited[to.h][to.w][to.dir][to.hand]) continue;
            
            visited[to.h][to.w][to.dir][to.hand]=1;
            par[to.h][to.w][to.dir][to.hand]=p;
            
            Q.push(to);
            
            //cout<<to.h<<" "<<to.w<<" "<<to.dir<<" "<<to.hand<<endl;
            
            if(to.h==gh&&to.w==gw){
                gdir=to.dir;
                ghand=to.hand;
                return 1;
            }
        }
    }
    
    return 0;
}

int main(){
    
    std::ifstream in("text.txt");
    std::cin.rdbuf(in.rdbuf());
    cin.tie(0);
    ios::sync_with_stdio(false);
    
    cin>>H>>W;
    for(int i=0;i<MAX;i++){
        for(int j=0;j<MAX;j++){
            S[i][j]='#';
        }
    }
    for(int i=0;i<H;i++){
        for(int j=0;j<W;j++){
            cin>>S[i+1][j+1];
            if(S[i+1][j+1]=='G'){
                gh=i+1;
                gw=j+1;
                S[i+1][j+1]='.';
            }
            for(int k=0;k<4;k++){
                if(S[i+1][j+1]==U[k]){
                    S[i+1][j+1]='.';
                    visited[i+1][j+1][k][2]=1;
                    sh=i+1;
                    sw=j+1;
                    sdir=k;
                    shand=2;
                }
            }
        }
    }
    
    for(int i=1;i<=H;i++){
        for(int j=1;j<=W;j++){
            if(S[i][j]=='#') continue;
            for(int k=0;k<4;k++){
                int fh=i+dh[k],fw=j+dw[k];
                int frh=i+dh[k]+dh[(k+3)%4],frw=j+dw[k]+dw[(k+3)%4];
                int rh=i+dh[(k+3)%4],rw=j+dw[(k+3)%4];
                int brh=i+dh[(k+2)%4]+dh[(k+3)%4],brw=j+dw[(k+2)%4]+dw[(k+3)%4];
                
                if(S[fh][fw]=='.'){
                    if(S[frh][frw]=='#') G[i][j][k][1].push_back({fh,fw,k,2});
                    if(S[rh][rw]=='#') G[i][j][k][2].push_back({fh,fw,k,3});
                }
                
                if(S[fh][fw]=='#') G[i][j][k][0].push_back({i,j,(k+1)%4,2});
                if(S[frh][frw]=='#') G[i][j][k][1].push_back({i,j,(k+1)%4,3});
                
                if(S[rh][rw]=='#') G[i][j][k][2].push_back({i,j,(k+3)%4,0});
                if(S[brh][brw]=='#') G[i][j][k][3].push_back({i,j,(k+3)%4,1});
                
                if(S[fh][fw]=='#'&&S[frh][frw]=='#'){
                    G[i][j][k][0].push_back({i,j,k,1});
                    G[i][j][k][1].push_back({i,j,k,0});
                }
                
                if(S[frh][frw]=='#'&&S[rh][rw]=='#'){
                    G[i][j][k][1].push_back({i,j,k,2});
                    G[i][j][k][2].push_back({i,j,k,1});
                }
                
                if(S[rh][rw]=='#'&&S[brh][brw]=='#'){
                    G[i][j][k][2].push_back({i,j,k,3});
                    G[i][j][k][3].push_back({i,j,k,2});
                }
                
                if(S[fh][fw]=='#'&&S[rh][rw]=='#'){
                    G[i][j][k][0].push_back({i,j,k,2});
                    G[i][j][k][2].push_back({i,j,k,0});
                }
            }
        }
    }
    
    if(BFS()){
        set<pair<int,int>> SE;
        while(gh!=sh||gw!=sw||gdir!=sdir||ghand!=shand){
            SE.insert({gh,gw});
            point to=par[gh][gw][gdir][ghand];
            
            gh=to.h;
            gw=to.w;
            gdir=to.dir;
            ghand=to.hand;
            
            //cout<<gh<<" "<<gw<<" "<<gdir<<endl;
        }
        SE.insert({sh,sw});
        
        cout<<SE.size()<<endl;
    }else{
        cout<<-1<<endl;
    }
    
    /*for(int i=1;i<=H;i++){
        for(int j=1;j<=W;j++){
            int a=0;
            for(int k=0;k<4;k++){
                for(int l=0;l<4;l++){
                    if(visited[i][j][k][l]) a=1;
                }
            }
            cout<<a;
        }
        cout<<endl;
    }*/
}




Measured memory_bytes: 6432