#include <bits/stdc++.h>
using namespace std;
FILE *outt, *inn;
const int N = 2009;
int n, m;
char c[N][N];
bool visited[N * N], ok;
int check[N * N], v[N * N], e[N * N], dis[N * N];
void dfs(int x, int y) {
  if (check[x] == y) {
    cout << -1;
    exit(0);
  }
  if (visited[x]) {
    return;
  }
  check[x] = y;
  visited[x] = 1;
  if (v[v[x]] == -1) {
    dis[x] = 1;
    e[x] = x;
    return;
  }
  dfs(v[x], y);
  dis[x] = dis[v[x]] + 1;
  e[x] = e[v[x]];
  return;
}
int main() {
  scanf("%d", &n), scanf("%d", &m);
  if (n < 3) {
    cout << 0;
    return 0;
  }
  memset(visited, 0, sizeof(visited));
  memset(check, 0, sizeof(check));
  memset(dis, 0, sizeof(dis));
  int counter = 0;
  for (int i = 0; i < n; i++) {
    scanf("%s", c[i]);
    for (int j = 0; j < m; j++) {
      int x = i * m + j;
      if (c[i][j] != '#') {
        counter++;
        if (c[i][j] == '>') {
          v[x] = x + 1;
        }
        if (c[i][j] == '<') {
          v[x] = x - 1;
        }
        if (c[i][j] == '^') {
          v[x] = x - m;
        }
        if (c[i][j] == 'v') {
          v[x] = x + m;
        }
      } else {
        v[x] = -1;
      }
    }
  }
  if (counter < 2) {
    cout << counter;
    return 0;
  }
  int ct = 1, ans = 0;
  vector<int> r;
  for (int i = 0; i < n * m; i++) {
    if (v[i] != -1 && !visited[i]) {
      dfs(i, ct);
      ct++;
    }
  }
  for (int i = 0; i < n * m; i++) {
    if (dis[i] > ans) {
      ans = dis[i];
      r.clear();
    }
    if (dis[i] == ans) {
      r.push_back(e[i]);
    }
  }
  while (r.size() > 1) {
    int f = r[r.size() - 1], g = r[r.size() - 2];
    if (f != g) {
      cout << 2 * ans;
      return 0;
    }
    r.pop_back();
  }
  cout << 2 * ans - 1;
  return 0;
}
