#include <bits/stdc++.h>   #pragma comment(linker,  /STACK:128777216 )   const int null = 0;   using namespace std;   template <class T>   int size(const T &a) {     return int(a.size());   }   template <class T>   T abs(const T &a) {     return (a < 0 ? -a : a);   }   template <class T>   T sqr(const T &a) {     return a * a;   }   const double pi = acos(-1.0);   const int max_n = 2048;   char s[max_n][max_n];   struct Res {     int r, c;     int d;     int moves;     Res() { moves = -1; }   } dp[max_n][max_n];   bool was[max_n][max_n];   Res &calc(int r, int c, int d = -1) {     Res &res = dp[r][c];     if (res.moves >= 0) {       return res;     }     if (was[r][c]) {       cout << -1 << endl;       exit(0);     }     was[r][c] = true;     switch (s[r][c]) {       case  # :         res.moves = 0;         res.d = -1;         res.r = r;         res.c = c;         break;       case  > :         res = calc(r, c + 1, 1);         res.moves++;         if (res.moves == 1) {           res.d = 1;         }         break;       case  < :         res = calc(r, c - 1, 2);         res.moves++;         if (res.moves == 1) {           res.d = 2;         }         break;       case  ^ :         res = calc(r - 1, c, 3);         res.moves++;         if (res.moves == 1) {           res.d = 3;         }         break;       case  v :         res = calc(r + 1, c, 4);         res.moves++;         if (res.moves == 1) {           res.d = 4;         }         break;     }     return res;   }   int main() {     int n, m;     scanf( %d %d , &n, &m);     for (int i = 0; i < n; i++) {       scanf( %s , s[i]);     }     int res = 0;     Res best;     for (int i = 0; i < n; i++) {       for (int j = 0; j < m; j++) {         Res cur = calc(i, j);         if (cur.moves > best.moves) {           best = cur;         }       }     }     for (int i = 0; i < n; i++) {       for (int j = 0; j < m; j++) {         Res cur = dp[i][j];         if (cur.moves + best.moves > res &&             (cur.d != best.d || cur.r != best.r || cur.c != best.c ||              cur.moves != best.moves)) {           res = cur.moves + best.moves;         }       }     }     cout << res << endl;     return 0;   }   