#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<string> v;
vector<char> used;
vector<int> pa;
inline int edge(int idx) {
  int i = idx / m, j = idx % m;
  switch (v[i][j]) {
    case '^':
      return ((i - 1) * m + (j));
      break;
    case 'v':
      return ((i + 1) * m + (j));
      break;
    case '<':
      return ((i)*m + (j - 1));
      break;
    case '>':
      return ((i)*m + (j + 1));
      break;
    default:
      return -1;
  }
}
inline bool dfs_c(int v) {
  used[v] = 1;
  int u = edge(v);
  if (u != -1) {
    if (used[u] == 1) return true;
    if (!used[u])
      if (dfs_c(u)) return true;
  }
  used[v] = 2;
  return false;
}
inline int dfs_r(int v) {
  if (pa[v] != -1) return pa[v];
  int u = edge(v);
  if (u == -1) return pa[v] = 0;
  return pa[v] = 1 + dfs_r(u);
}
inline pair<int, int> maxp() {
  int mp = 0, src = 0;
  for (int i = 0; i < n * m; ++i) {
    int p = dfs_r(i);
    if (p > mp) {
      mp = p;
      src = i;
    }
  }
  return make_pair(mp, src);
}
int main() {
  scanf("%d%d", &n, &m);
  v.resize(n);
  for (int i = 0; i < n; ++i) cin >> v[i];
  used.resize(n * m);
  for (int i = 0; i < n * m; ++i) {
    if (!used[i]) {
      if (dfs_c(i)) {
        printf("-1");
        return 0;
      }
    }
  }
  pa.assign(n * m, -1);
  pair<int, int> mp = maxp();
  int idx = mp.second;
  while (idx != -1) {
    int next = edge(idx);
    v[idx / m][idx % m] = '#';
    idx = next;
  }
  pa.assign(n * m, -1);
  pair<int, int> mp2 = maxp();
  int snd = max(mp.first - 1, mp2.first);
  if (snd < 0) snd = 0;
  printf("%d", mp.first + snd);
  return 0;
}
