#include <bits/stdc++.h>
using namespace std;
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};
int n, m, tt = 0;
char a[2010][2010];
int v[2010][2010], f[2010][2010], g[2010][2010];
int O[256];
void work(int x, int y) {
  if (f[x][y]) return;
  int nx = x + dx[O[a[x][y]]];
  int ny = y + dy[O[a[x][y]]];
  if (a[nx][ny] == '#') {
    f[x][y] = 1;
    g[x][y] = x * (n + 1) + y;
    return;
  }
  work(nx, ny);
  f[x][y] = f[nx][ny] + 1;
  g[x][y] = g[nx][ny];
}
int main() {
  O['<'] = 3, O['>'] = 1, O['^'] = 2, O['v'] = 0;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; ++i) scanf("%s", a[i] + 1);
  int nx, ny;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j)
      if (a[i][j] != '#' && !v[i][j]) {
        ++tt;
        nx = i, ny = j;
        while (!v[nx][ny] && a[nx][ny] != '#') {
          v[nx][ny] = tt;
          nx += dx[O[a[nx][ny]]];
          ny += dy[O[a[nx][ny]]];
        }
        if (a[nx][ny] == '#') continue;
        if (v[nx][ny] == tt) return puts("-1"), 0;
      }
  if (tt == 0) return puts("0"), 0;
  int ans = 0, tp = -1;
  bool Two = false;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j)
      if (a[i][j] != '#') {
        work(i, j);
        if (f[i][j] > ans) {
          ans = f[i][j];
          tp = g[i][j];
          Two = false;
        } else if (f[i][j] == ans && g[i][j] != tp) {
          Two = true;
        }
      }
  printf("%d\n", ans * 2 - (Two == false));
  return 0;
}
