#define  _CRT_SECURE_NO_WARNINGS
#pragma comment (linker, "/STACK:526000000")

#include "bits/stdc++.h"

using namespace std;
typedef string::const_iterator State;
#define eps 1e-11L
#define MAX_MOD 1000000007LL
#define GYAKU 500000004LL

#define MOD 998244353LL
#define seg_size 262144 * 4LL
#define pb push_back
#define mp make_pair
typedef long long ll;
#define REP(a,b) for(long long (a) = 0;(a) < (b);++(a))
#define ALL(x) (x).begin(),(x).end()

void init() {
	iostream::sync_with_stdio(false);
	cout << fixed << setprecision(20);
}

#define int ll
int grid[100][100] = {};
void solve() {
	int n, m;
	cin >> n >> m;
	vector<string> inputs;
	tuple<int, int, int> now;
	string c;
	REP(i, m + 2) {
		c.push_back('#');
	}
	inputs.push_back(c);
	REP(i, n) {
		string s;
		cin >> s;
		s.push_back('#');
		s.insert(s.begin(), '#');
		inputs.push_back(s);
	}
	inputs.push_back(c);
	m += 2;
	n += 2;

	int dx[4] = { -1,0,1,0 };
	int dy[4] = { 0,1,0,-1 };
	string nya = "^>v<";
	pair<int,int> goal;
	REP(i, n) {
		REP(q, m) {
			REP(j, 4) {
				if (nya[j] == inputs[i][q]) {
					now = make_tuple(i, q, j);
					inputs[i][q] = '.';
				}
			}
			if (inputs[i][q] == 'G') {
				inputs[i][q] = '.';
				goal = mp(i, q);
			}
		}
	}
	REP(tea, 1000000) {
		grid[get<0>(now)][get<1>(now)] = 1;
		if (mp(get<0>(now), get<1>(now)) == goal) {
			int ans = 0;
			REP(i, n) {
				REP(q, m) {
					ans += grid[i][q];
				}
			}
			cout << ans << endl;
			return;
		}
		get<2>(now)++;
		get<2>(now) %= 4;
		int next_x = get<0>(now) + dx[get<2>(now)];
		int next_y = get<1>(now) + dy[get<2>(now)];
		if (inputs[next_x][next_y] == '.') {
			get<0>(now) = next_x;
			get<1>(now) = next_y;
			continue;
		}
		REP(t,4) {
			get<2>(now) += 3;
			get<2>(now) %= 4;
			int next_x = get<0>(now) + dx[get<2>(now)];
			int next_y = get<1>(now) + dy[get<2>(now)];
			if (inputs[next_x][next_y] == '.') {
				get<0>(now) = next_x;
				get<1>(now) = next_y;
				break;
			}
		}
	}
	cout << -1 << endl;
}

#undef int
int main() {
	init();
	solve();
}
