#include <bits/stdc++.h>
using namespace std;
int n,m,v[4000][4000],c[4] = {-1,1,0,0},d[4] = {0,0,-1,1},sx,sy,ex,ey;
char a[4000][4000];
struct _{
int x,y,st;
};
queue <_> q;
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
cin >> a[i][j];
if(a[i][j] == 'S'){
sx = i,sy = j;
a[i][j] = '.';
}
if(a[i][j] == 'G'){
ex = i,ey = j;
a[i][j] = '.';
}
}
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(a[i][j] == 'v'){
for(int k = i + 1; k <= n; k++){
if(a[k][j] != '.'){
break;
}
a[k][j] = '#';
}
}else if(a[i][j] == '^'){
for(int k = i - 1; k; k--){
if(a[k][j] != '.'){
break;
}
a[k][j] = '#';
}
}else if(a[i][j] == '<'){
for(int k = j - 1; k; k--){
if(a[i][k] != '.'){
break;
}
a[i][k] = '#';
}
}else if(a[i][j] == '>'){
for(int k = j + 1; k <= m; k++){
if(a[i][k] != '.'){
break;
}
a[i][k] = '#';
}
}
}
}
if(sx == 0 || sy == 0 || ex == 0 || ey == 0 || a[sx][sy] == '#' || a[ex][ey] == '#'){
cout << -1;
return 0;
}
q.push({ex,ey,0});
v[ex][ey] = 1;
while(q.size()){
_ __ = q.front();
q.pop();
for(int i = 0; i < 4; i++){
int nx = __.x + c[i],ny = __.y + d[i];
if(nx > 0 && nx <= n && ny > 0 && ny <= m && !v[nx][ny] && (a[nx][ny] == '.' || a[nx][ny] == 'G')){
v[nx][ny] = 1;
q.push({nx,ny,__.st + 1});
if(nx == sx && ny == sy){
cout << q.back().st;
return 0;
}
}
}
}
cout << -1;
return 0;
}
WA90分,一个该输出-1的点输出了一个正整数