#include <bits/stdc++.h>
#pragma comment(linker, "/STACK: 2000000")
using namespace std;
const char first[] = "input.txt";
const char fo[] = "";
int m, n, sl = 0;
char s[2002][2002];
void input() {
  cin >> m >> n;
  for (int i = 0; i < m; ++i) cin >> s[i];
}
vector<int> res;
string pa = "^>v<#";
int bx[] = {-1, 0, 1, 0, -3}, by[] = {0, 1, 0, -1, -3};
pair<int, int> next(const pair<int, int>& u) {
  int vt = pa.find(s[u.first][u.second]);
  return make_pair(u.first + bx[vt], u.second + by[vt]);
}
bool check(const pair<int, int>& u) {
  return u.first >= 0 && u.first < m && u.second >= 0 && u.second < n;
}
bool cyc;
int res0, res1;
int dfs(const pair<int, int>& u) {
  ++sl;
  int tmp = 1;
  for (int i = 0; i < 4; ++i) {
    pair<int, int> v = make_pair(u.first + bx[i], u.second + by[i]);
    if (check(v) && next(v) == u) {
      tmp = max(tmp, dfs(v) + 1);
    }
  }
  return tmp;
}
void cal(const pair<int, int>& u) {
  ++sl;
  for (int i = 0; i < 4; ++i) {
    pair<int, int> v = make_pair(u.first + bx[i], u.second + by[i]);
    if (check(v) && next(v) == u) {
      int tmp = dfs(v);
      if (tmp > res1) {
        res0 = res1;
        res1 = tmp;
      } else
        res0 = max(res0, tmp);
    }
  }
}
void solve() {
  res0 = res1 = 0;
  cyc = false;
  for (int i = 0; i < m; ++i)
    for (int j = 0; j < n; ++j)
      if (s[i][j] == '#') cal(make_pair(i, j));
  if (sl < m * n) cyc = true;
  if (cyc) {
    cout << -1;
    return;
  }
  if (res1 == 0) {
    cout << 0;
    return;
  }
  int ans = 2 * res1 - 1;
  if (res0 > 0) ans = max(ans, res0 + res1);
  if (ans <= 1)
    cout << 0 << '\n';
  else
    cout << ans << '\n';
}
int main() {
  ios::sync_with_stdio(0);
  input();
  solve();
  return 0;
}
