#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e6 + 20;
int N, M, used[maxn], mx[maxn], h[maxn], foo, ans = 1;
vector<int> komsu[maxn];
int dfs(int node) {
  if (used[node]) return mx[node] + 1;
  used[node] = 1;
  for (int i = 0; i < komsu[node].size(); i++) {
    if (used[komsu[node][i]] == 1) {
      printf("-1\n");
      exit(0);
    }
    int a = dfs(komsu[node][i]);
    if (a > mx[node]) {
      mx[node] = a;
      h[node] = 1;
    } else if (a == mx[node])
      h[node]++;
  }
  if (mx[node] > ans) {
    ans = mx[node];
    foo = h[node];
  } else if (mx[node] == ans)
    foo += h[node];
  used[node] = 2;
  return mx[node] + 1;
}
int main() {
  scanf("%d %d", &N, &M);
  for (int i = 0; i < N; i++)
    for (int j = 1; j <= M; j++) {
      char a;
      scanf(" %c", &a);
      if (a == '>') komsu[i * M + j + 1].push_back(i * M + j);
      if (a == '<') komsu[i * M + j - 1].push_back(i * M + j);
      if (a == '^') komsu[(i - 1) * M + j].push_back(i * M + j);
      if (a == 'v') komsu[(i + 1) * M + j].push_back(i * M + j);
    }
  N *= M;
  for (int i = 1; i <= N; i++)
    if (!used[i]) dfs(i);
  if (foo > 1)
    printf("%d\n", 2 * ans);
  else
    printf("%d\n", foo * ans + ans - 1);
  return 0;
}
