#include <bits/stdc++.h>
using namespace std;
int di[] = {0, 0, 1, -1};
int dj[] = {1, -1, 0, 0};
int z[128];
int vis[2016][2016], n, m, ans[2016][2016], bei[2016][2016], bej[2016][2016],
    mx, mi1 = -1, mi2 = -1, mj1 = -1, mj2 = -1;
char grid[2016][2016];
bool dfs(int i, int j) {
  if (vis[i][j] == 1) return 1;
  if (vis[i][j] == 2 || grid[i][j] == '#') return 0;
  vis[i][j] = 1;
  int ti = i + di[z[grid[i][j]]], tj = j + dj[z[grid[i][j]]];
  if (dfs(ti, tj)) return 1;
  ans[i][j] = 1 + ans[ti][tj];
  if (grid[ti][tj] == '#')
    bei[i][j] = i, bej[i][j] = j;
  else
    bei[i][j] = bei[ti][tj], bej[i][j] = bej[ti][tj];
  if (ans[i][j] > mx) {
    mx = ans[i][j], mi1 = mi2 = bei[i][j], mj1 = mj2 = bej[i][j];
  } else if (ans[i][j] == mx) {
    if (mi1 != bei[i][j] || mj1 != bej[i][j]) mi2 = bei[i][j], mj2 = bej[i][j];
  }
  vis[i][j] = 2;
  return 0;
}
int main() {
  z['<'] = 1;
  z['v'] = 2;
  z['^'] = 3;
  cin >> n >> m;
  for (int i = 0; i < n; ++i) scanf(" %s", &grid[i]);
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j) {
      if (dfs(i, j)) return puts("-1");
    }
  cout << max(0, 2 * mx - (mi1 == mi2 && mj1 == mj2));
};
