#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;
}
