#include <bits/stdc++.h>
using namespace std;
int d[2010][2010], v[2010][2010];
char s[2010][2010];
queue<pair<int, int> > q;
void cmp(int i, int j, int first, int second) {
  if (d[i][j] < d[first][second] + 1)
    d[i][j] = d[first][second] + 1, q.push(make_pair(i, j));
}
bool move(int first, int second) {
  if (s[first][second] == '#') return 1;
  if (v[first][second]) return 0;
  v[first][second] = 1;
  if (s[first][second] == '^') return move(first - 1, second);
  if (s[first][second] == 'v') return move(first + 1, second);
  if (s[first][second] == '>') return move(first, second + 1);
  if (s[first][second] == '<') return move(first, second - 1);
}
int main() {
  int n, m, i, j, k;
  while (~scanf("%d%d", &n, &m)) {
    for (i = 0; i < n; i++) scanf("%s", s[i]);
    memset(d, 0, sizeof(d));
    for (i = 0; i < n; i++) {
      for (j = 0; j < m; j++)
        if (s[i][j] == '#') q.push(make_pair(i, j));
    }
    while (!q.empty()) {
      int first = q.front().first, second = q.front().second;
      q.pop();
      if (first && s[first - 1][second] == 'v')
        cmp(first - 1, second, first, second);
      if (second && s[first][second - 1] == '>')
        cmp(first, second - 1, first, second);
      if (first < n - 1 && s[first + 1][second] == '^')
        cmp(first + 1, second, first, second);
      if (second < m - 1 && s[first][second + 1] == '<')
        cmp(first, second + 1, first, second);
    }
    int mx = 0, f = 0;
    for (i = 0; i < n; i++)
      for (j = 0; j < m; j++)
        if (s[i][j] != '#' && d[i][j] == 0) {
          f = 1;
          break;
        } else if (mx < d[i][j])
          mx = d[i][j];
    if (f)
      puts("-1");
    else {
      if (mx == 0) {
        puts("0");
        continue;
      }
      memset(v, 0, sizeof(v));
      int ans = 2 * mx - 2;
      for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
          if (d[i][j] == mx && move(i, j)) ans++;
      printf("%d\n", min(mx * 2, ans));
    }
  }
}
