#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2000 + 10;
const int d[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
const char ch[4] = {'<', '>', '^', 'v'};
int n, m, f[MAXN][MAXN], head, tail, que[MAXN * MAXN], Tohka, Mashiro,
    bel[MAXN][MAXN], A = -1, B;
char a[MAXN][MAXN];
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) scanf("%s", a[i] + 1);
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j)
      if (a[i][j] == '#') que[++tail] = i * m + j - 1;
  while (head < tail) {
    ++head;
    int first = que[head] / m, second = que[head] % m + 1;
    for (int i = 0; i < 4; ++i) {
      int nx = first + d[i][0], ny = second + d[i][1];
      if (a[nx][ny] == ch[i]) {
        f[nx][ny] = f[first][second] + 1;
        if (!f[first][second])
          bel[nx][ny] = nx * m + ny - 1;
        else
          bel[nx][ny] = bel[first][second];
        if (f[nx][ny] > Tohka)
          Mashiro = Tohka, B = A, Tohka = f[nx][ny], A = bel[nx][ny];
        else if (Mashiro < f[nx][ny])
          Mashiro = f[nx][ny], B = bel[nx][ny];
        que[++tail] = nx * m + ny - 1;
      }
    }
  }
  if (tail != n * m)
    puts("-1");
  else if (A != B)
    printf("%d\n", max(Mashiro + Tohka, Tohka * 2 - 1));
  else
    cout << Tohka * 2 - 1 << endl;
  fclose(stdin);
  fclose(stdout);
  return 0;
}
