#include <bits/stdc++.h>
using namespace std;
int h,w,dx[]={0,1,0,-1},dy[]={-1,0,1,0};
string mp[55];
struct po{
  int x,y,dir;
  po(int y,int x,int dir): x(x),y(y),dir(dir){}
};

int check(int y,int x,int dir){
  return mp[y+dy[dir%4]][x+dx[dir%4]]=='#';
}

int bfs(int sy,int sx,int sdir){
  int used[55][55][4]={},D[55][55]={};
  queue <po> Q;
  Q.push(po(sy,sx,sdir));
  D[sy][sx]=1;

  while(!Q.empty()){
    po t=Q.front();Q.pop();
    int x=t.x,y=t.y,dir=t.dir;
    if(mp[y][x]=='G') return D[y][x];
    if(used[y][x][dir]++)continue;
    
    int nx=x+dx[dir],ny=y+dy[dir],ndir=(dir+3)%4;
    if(check(y,x,dir)&&check(y,x,dir+1))Q.push(po(y,x,ndir));
    
    if(mp[ny][nx]!='#'){
      ndir=check(ny,nx,dir+1)? dir:(dir+1)%4;
      Q.push(po(ny,nx,ndir));
      D[ny][nx]=D[y][x]+!D[ny][nx];
    }
  }
  return -1;
}

int main(){
  cin>>h>>w;
  for(int i=0;i<=w+1;i++) mp[0]+='#',mp[h+1]+='#';
  for(int i=1;i<=h;i++) cin>>mp[i],mp[i]='#'+mp[i]+'#';

  int sx,sy,dir;
  for(int i=0;i<=h;i++)
    for(int j=0;j<=w;j++) {
      if(mp[i][j]=='^')dir=0,sy=i,sx=j;
      if(mp[i][j]=='>')dir=1,sy=i,sx=j;
      if(mp[i][j]=='v')dir=2,sy=i,sx=j;
      if(mp[i][j]=='<')dir=3,sy=i,sx=j;
    }
  cout <<bfs(sy,sx,dir)<<endl; 
  return 0;
}