#include<bits/stdc++.h>
using namespace std;
#define lp(i,n) for(int i=0;i<n;i++)
char a[60][60],memo[60][60];
int ans,gx,gy;
set<tuple<int,int,int>> dp;
void move(int x,int y,int direc){
  int count=0;
  while(1){
    decltype(dp)::iterator it =dp.find(make_tuple(x,y,direc));
    if(it!=dp.end()) return;
    dp.insert(make_tuple(x,y,direc));
    if(memo[x][y]==0){
      count++;
      memo[x][y]=1;
    }
    if(x==gx&&y==gy){
      ans=count;
      return;
    }
    if(direc==1){
      if(a[x][y+1]=='.'){
	y++;
	direc=4;
      }
      else{
	if(a[x+1][y]=='#') direc=2;
	else x++;
      }
    }
    else if(direc==2){
      if(a[x+1][y]=='.'){
	x++;
	direc=1;
      }
      else{
	if(a[x][y-1]=='#') direc=3;
	else y--;
      } 
    }
    else if(direc==3){
      if(a[x][y-1]=='.'){
	y--;
	direc=2;
      }
      else{
	if(a[x-1][y]=='#') direc=4;
	else x--;
      } 
    }
    else if(direc==4){
      if(a[x-1][y]=='.'){
	x--;
	direc=3;
      }
      else{
	if(a[x][y+1]=='#') direc=1;
	else y++;
      }
    }
  }
  return;
}
    
int main(){
    int n,m;
    cin>>n>>m;
    lp(i,60){
      lp(j,60){
	a[i][j]='#';
	memo[i][j]=0;
      }
    }
    int direc,sx,sy;
    lp(i,n+1){
      if(i==0) continue;
      lp(j,m+1){
	if(j==0) continue;
	cin>>a[j][i];
	if(a[j][i]=='G'){
	  gx=j;
	  gy=i;
	  a[j][i]='.';
	}
	if(a[j][i]=='<'){
	  sx=j;
	  sy=i;
	  direc=3;
	  a[j][i]='.';
	}
	if(a[j][i]=='^'){
	  sx=j;
	  sy=i;
	  direc=2;
	  a[j][i]='.';
	}
	if(a[j][i]=='>'){
	  sx=j;
	  sy=i;
	  direc=1;
	  a[j][i]='.';
	}
	if(a[j][i]=='v'){
	  sx=j;
	  sy=i;
	  direc=4;
	  a[j][i]='.';
	}
      }
    }
    ans=0;
    dp.clear();
    move(sx,sy,direc);
    if(ans==0) cout<<"-1"<<endl;
    else cout<<ans<<endl;
  return 0;
}

