#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;

int main() {

  long long int n, m;
  cin >> n >> m;

  vector< string > s;

  s.push_back( "#######################################################" );
  for ( long long int i = 0; i < n; i++ ) {
    string in;
    cin >> in;
    in = "#" + in + "#";
    s.push_back( in );
  }
  s.push_back( "#######################################################" );

  bool c[53][53][4][4];
  bool cc[53][53];
  vector< long long int > v;
  for ( long long int i = 0; i < n + 2; i++ ) {
    for ( long long int j = 0; j < m + 2; j++ ) {
      for ( long long int k = 0; k < 4; k++ ) {
	for ( long long int l = 0; l < 4; l++ ) {
	  c[i][j][k][l] = false;
	}
      }
      cc[i][j] = false;
      if ( s[i][j] == '^' ) {
	v.push_back( i );
	v.push_back( j );
	v.push_back( 0 );
	if ( s[i-1][j] == '#' ) {
	  v.push_back( 0 );
	}else if ( s[i-1][j+1] == '#' ) {
	  v.push_back( 1 );
	}else if ( s[i][j+1] == '#' ) {
	  v.push_back( 2 );
	}else if ( s[i+1][j+1] == '#' ) {
	  v.push_back( 3 );
	}
      }else if ( s[i][j] == 'v' ) {
	v.push_back( i );
	v.push_back( j );
	v.push_back( 1 );
	if ( s[i+1][j] == '#' ) {
	  v.push_back( 0 );
	}else if ( s[i+1][j-1] == '#' ) {
	  v.push_back( 1 );
	}else if ( s[i][j-1] == '#' ) {
	  v.push_back( 2 );
	}else if ( s[i-1][j-1] == '#' ) {
	  v.push_back( 3 );
	}
      }else if ( s[i][j] == '<' ) {
	v.push_back( i );
	v.push_back( j );
	v.push_back( 2 );
	if ( s[i][j-1] == '#' ) {
	  v.push_back( 0 );
	}else if ( s[i-1][j-1] == '#' ) {
	  v.push_back( 1 );
	}else if ( s[i-1][j] == '#' ) {
	  v.push_back( 2 );
	}else if ( s[i-1][j+1] == '#' ) {
	  v.push_back( 3 );
	}
      }else if ( s[i][j] == '>' ) {
	v.push_back( i );
	v.push_back( j );
	v.push_back( 3 );
	if ( s[i][j+1] == '#' ) {
	  v.push_back( 0 );
	}else if ( s[i+1][j+1] == '#' ) {
	  v.push_back( 1 );
	}else if ( s[i+1][j] == '#' ) {
	  v.push_back( 2 );
	}else if ( s[i+1][j-1] == '#' ) {
	  v.push_back( 3 );
	}
      }
    }
  }

  queue< vector< long long int > > q;
  q.push( v );

  long long int ans = 0;

  while( q.size() > 0 ) {

    vector< long long int > p;
    p = q.front();
    q.pop();
    long long int y = p[0];
    long long int x = p[1];
    long long int d = p[2];
    long long int r = p[3];

    if ( c[y][x][d][r] == true ) continue;
    c[y][x][d][r] = true;
    if ( cc[y][x] == false ) {
      ans++;
      cc[y][x] = true;
    }
    if ( s[y][x] == 'G' ) {
      cout << ans << endl;
      return 0;
    }

    if ( r == 1 || r == 2 ) {
      if ( d == 0 ) {
	if ( s[y-1][x] != '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y - 1 );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( r + 1 );
	  q.push( vv );
	}
      }else if ( d == 1 ) {
	if ( s[y+1][x] != '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y + 1 );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( r + 1 );
	  q.push( vv );
	}
      }else if ( d == 2 ) {
	if ( s[y][x-1] != '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x - 1 );
	  vv.push_back( d );
	  vv.push_back( r + 1 );
	  q.push( vv );
	}
      }else if ( d == 3 ) {
	if ( s[y][x+1] != '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x + 1 );
	  vv.push_back( d );
	  vv.push_back( r + 1 );
	  q.push( vv );
	}
      }
    }

    if ( r == 2 || r == 3 ) {
      if ( d == 0 ) {
	vector< long long int > vv;
	vv.push_back( y );
	vv.push_back( x );
	vv.push_back( 3 );
	vv.push_back( r - 2 );
	q.push( vv );
      }else if ( d == 1 ) {
	vector< long long int > vv;
	vv.push_back( y );
	vv.push_back( x );
	vv.push_back( 2 );
	vv.push_back( r - 2 );
	q.push( vv );
      }else if ( d == 2 ) {
	vector< long long int > vv;
	vv.push_back( y );
	vv.push_back( x );
	vv.push_back( 0 );
	vv.push_back( r - 2 );
	q.push( vv );
      }else if ( d == 3 ) {
	vector< long long int > vv;
	vv.push_back( y );
	vv.push_back( x );
	vv.push_back( 1 );
	vv.push_back( r - 2 );
	q.push( vv );
      }
    }else {
      if ( d == 0 ) {
	vector< long long int > vv;
	vv.push_back( y );
	vv.push_back( x );
	vv.push_back( 2 );
	vv.push_back( r + 2 );
	q.push( vv );
      }else if ( d == 1 ) {
	vector< long long int > vv;
	vv.push_back( y );
	vv.push_back( x );
	vv.push_back( 3 );
	vv.push_back( r + 2 );
	q.push( vv );
      }else if ( d == 2 ) {
	vector< long long int > vv;
	vv.push_back( y );
	vv.push_back( x );
	vv.push_back( 1 );
	vv.push_back( r + 2 );
	q.push( vv );
      }else if ( d == 3 ) {
	vector< long long int > vv;
	vv.push_back( y );
	vv.push_back( x );
	vv.push_back( 0 );
	vv.push_back( r + 2 );
	q.push( vv );
      }
    }

    if ( d == 0 ) {
      if ( r == 1 || r == 2 ) {
	if ( s[y-1][x] == '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( 0 );
	  q.push( vv );
	}
      }
      if ( r == 0 || r == 2 ) {
	if ( s[y-1][x+1] == '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( 1 );
	  q.push( vv );
	}
      }
      if ( r != 2 ) {
	if ( s[y][x+1] == '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( 2 );
	  q.push( vv );
	}
      }
      if ( r == 2 ) {
	if ( s[y+1][x+1] == '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( 3 );
	  q.push( vv );
	}
      }
    }else if ( d == 1 ) {
      if ( r == 1 || r == 2 ) {
	if ( s[y+1][x] == '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( 0 );
	  q.push( vv );
	}
      }
      if ( r == 0 || r == 2 ) {
	if ( s[y+1][x-1] == '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( 1 );
	  q.push( vv );
	}
      }
      if ( r != 2 ) {
	if ( s[y][x-1] == '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( 2 );
	  q.push( vv );
	}
      }
      if ( r == 2 ) {
	if ( s[y-1][x-1] == '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( 3 );
	  q.push( vv );
	}
      }
    }else if ( d == 2 ) {
      if ( r == 1 || r == 2 ) {
	if ( s[y][x-1] == '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( 0 );
	  q.push( vv );
	}
      }
      if ( r == 0 || r == 2 ) {
	if ( s[y-1][x-1] == '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( 1 );
	  q.push( vv );
	}
      }
      if ( r != 2 ) {
	if ( s[y-1][x] == '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( 2 );
	  q.push( vv );
	}
      }
      if ( r == 2 ) {
	if ( s[y-1][x+1] == '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( 3 );
	  q.push( vv );
	}
      }
    }else if ( d == 3 ) {
      if ( r == 1 || r == 2 ) {
	if ( s[y][x+1] == '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( 0 );
	  q.push( vv );
	}
      }
      if ( r == 0 || r == 2 ) {
	if ( s[y+1][x+1] == '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( 1 );
	  q.push( vv );
	}
      }
      if ( r != 2 ) {
	if ( s[y+1][x] == '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( 2 );
	  q.push( vv );
	}
      }
      if ( r == 2 ) {
	if ( s[y+1][x-1] == '#' ) {
	  vector< long long int > vv;
	  vv.push_back( y );
	  vv.push_back( x );
	  vv.push_back( d );
	  vv.push_back( 3 );
	  q.push( vv );
	}
      }
    }

  }

  cout << -1 << endl;

  return 0;

}

Measured memory_bytes: 1312