#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<climits>
#include<iostream>
#include<sstream>
#include<utility>
#include<map>
#include<vector>
#include<queue>
#include<algorithm>
#include<set>
#include<stack>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
typedef struct D
{
	int x,y,d,h[2];
}D;

D tmp;
char M[55][55];
bool f[55][55]={0};
int H,W,flg[55][55][4],s[3],g[2],mv[9][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};

void dbg()
{
	for(int i=0;i<=H+1;i++,puts(""))
		for(int j=0;j<=W+1;j++)
			putchar(M[i][j]);
}

int main() 
{
	memset(flg,0x7f,sizeof(flg));
	scanf("%d%d\n",&H,&W);
	for(int i=1;i<=H;i++)
		gets(M[i]+1);
	for(int i=0;i<=H+1;i++)
	{
		M[i][0]=M[i][W+1]='#';
		if(i==0||i==H+1)
			for(int j=1;j<=W;j++)
				M[i][j]='#';
	}
	for(int i=0;i<=H+1;i++)
		for(int j=0;j<=W+1;j++)
		{
			if(M[i][j]=='G')
			{
				g[0]=i;g[1]=j;
				M[i][j]='.';
			}
			else if(M[i][j]!='#'&&M[i][j]!='.')
			{
				f[i][j]=1;
				tmp.x=j;
				tmp.y=i;
				switch(M[i][j])
				{
				case '^':tmp.d=0;break;
				case '>':tmp.d=2;break;
				case 'v':tmp.d=4;break;
				case '<':tmp.d=6;break;
				}
				M[i][j]='.';
				tmp.h[0]=tmp.y+mv[(tmp.d+2)%8][0];
				tmp.h[1]=tmp.x+mv[(tmp.d+2)%8][1];
			}
		}
	//dbg();
	for(int c=0;c<10000&&(tmp.y!=g[0]||tmp.x!=g[1]);c++)
	{
		int fx=(tmp.x+mv[tmp.d][1]),fy=(tmp.y+mv[tmp.d][0]);
		int frx=tmp.x+mv[(tmp.d+1)%8][1],fry=tmp.y+mv[(tmp.d+1)%8][0];
		int rx=tmp.x+mv[(tmp.d+2)%8][1],ry=tmp.y+mv[(tmp.d+2)%8][0];
		int brx=tmp.x+mv[(tmp.d+3)%8][1],bry=tmp.y+mv[(tmp.d+3)%8][0];
		//printf("%d %d %d | %d %d\n",tmp.y,tmp.x,tmp.d,tmp.h[0],tmp.h[1]);
		if(M[ry][rx]=='.'&&(tmp.h[0]==bry&&tmp.h[1]==brx))
		{
			tmp.d=(tmp.d+2)%8;
		}
		else if(M[fy][fx]=='#')
		{
			tmp.d=(tmp.d-2+8)%8;
			tmp.h[0]=tmp.y+mv[(tmp.d+2)%8][0];
			tmp.h[1]=tmp.x+mv[(tmp.d+2)%8][1];
		}
		else
		{
			tmp.y+=mv[tmp.d][0];
			tmp.x+=mv[tmp.d][1];
			if(tmp.h[0]==bry&&tmp.h[1]==brx)
			{
				tmp.h[0]+=mv[tmp.d][0];
				tmp.h[1]+=mv[tmp.d][1];
			}
			f[tmp.y][tmp.x]=1;
		}
	}
	if(tmp.y!=g[0]||tmp.x!=g[1])puts("-1");
	else
	{
		int r=0;
		for(int i=0;i<=H+1;i++)
			for(int j=0;j<=W+1;j++)
				r+=f[i][j];
		printf("%d\n",r);
	}
	return 0;
}