#include <bits/stdc++.h>
using namespace std;
const int maxn = 2020;
char a[maxn][maxn];
bool f[maxn][maxn];
int num[maxn][maxn];
bool flag, ff;
int Max;
int go[4][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
int get_d(char c) {
  if (c == '<') return 3;
  if (c == '>') return 2;
  if (c == '^') return 0;
  if (c == 'v') return 1;
  return -1;
}
int dfs(int x, int y) {
  if (num[x][y]) return num[x][y];
  if (f[x][y]) flag = 1;
  if (flag == 1) return 0;
  int k = get_d(a[x][y]);
  if (k == -1) return 0;
  f[x][y] = 1;
  int nx = x + go[k][0], ny = y + go[k][1];
  num[x][y] = dfs(nx, ny) + 1;
  Max = max(Max, num[x][y]);
  f[x][y] = 0;
  return num[x][y];
}
void dd(int x, int y) {
  if (f[x][y] && num[x][y]) ff = 1;
  f[x][y] = 1;
  int k = get_d(a[x][y]);
  if (k == -1) return;
  int nx = x + go[k][0], ny = y + go[k][1];
  dd(nx, ny);
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  flag = 0;
  Max = 0;
  for (int i = 0; i < n; i++) scanf("%s", a[i]);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (!num[i][j]) {
        dfs(i, j);
      }
    }
  }
  bool hehe = 0;
  if (flag)
    printf("-1\n");
  else {
    int nn = 0;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        if (num[i][j] == Max) {
          ff = 0;
          nn++;
          dd(i, j);
        }
        if (nn > 1 && (!ff)) hehe = 1;
      }
    }
    if (Max > 0) {
      if (hehe)
        cout << 2 * Max << endl;
      else
        cout << 2 * Max - 1 << endl;
    } else
      cout << 0 << endl;
  }
}
