#include <bits/stdc++.h>
using namespace std;
const int N = 2000 * 2000 + 1;
int n, m, mark[N], mx, rep;
string s;
vector<int> adj[N];
bool circle(int v) {
  mark[v] = 1;
  for (int i = 0; i < adj[v].size(); i++) {
    int u = adj[v][i];
    if (mark[u] == 1 || (!mark[u] && circle(u))) return true;
  }
  mark[v] = 2;
  return false;
}
int dfs(int v) {
  int res = 1;
  for (int i = 0; i < adj[v].size(); i++) {
    int u = adj[v][i], t = dfs(u);
    res = max(res, t + 1);
    if (t > mx)
      mx = t, rep = false;
    else if (t == mx)
      rep = true;
  }
  return res;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    string t;
    cin >> t;
    s += t;
  }
  n *= m;
  for (int i = 0; i < n; i++)
    if (s[i] == '^')
      adj[i - m].push_back(i);
    else if (s[i] == '<')
      adj[i - 1].push_back(i);
    else if (s[i] == '>')
      adj[i + 1].push_back(i);
    else if (s[i] == 'v')
      adj[i + m].push_back(i);
  for (int i = 0; i < n; i++)
    if (circle(i)) {
      cout << -1 << '\n';
      return 0;
    }
  fill(mark, mark + n, 0);
  for (int i = 0; i < n; i++)
    if (s[i] == '#') dfs(i);
  cout << max(0, 2 * mx - !rep) << '\n';
  return 0;
}
