#include <bits/stdc++.h>
using namespace std;
const int rx[] = {0, -1, 0, 1, -1, 1, 1, -1};
const int cy[] = {1, 0, -1, 0, 1, 1, -1, -1};
int di[] = {-1, 1, 0, 0};
int dj[] = {0, 0, -1, 1};
char arrow[] = {'v', '^', '>', '<'};
char a[2005][2005];
bool vis[2005][2005];
bool cvis[2005][2005];
int n, m, cycle;
int dfs(int x, int y, char c) {
  if (x < 0 || x >= n || y < 0 || y >= m || a[x][y] != c) return 0;
  if (vis[x][y]) {
    cout << "-1" << endl;
    exit(0);
  }
  vis[x][y] = true;
  cycle--;
  int d = 0;
  for (int k = 0; k < 4; k++) d = max(d, dfs(x + di[k], y + dj[k], arrow[k]));
  return d + 1;
}
int cdfs(int x, int y) {
  if (x < 0 || x >= n || y < 0 || y >= m) return 0;
  if (cvis[x][y]) return 1;
  cvis[x][y] = 1;
  switch (a[x][y]) {
    case '<':
      y--;
      break;
    case '>':
      y++;
      break;
    case 'V':
      x++;
      break;
    case '^':
      x--;
      break;
    case '#':
      cvis[x][y] = 0;
      return 0;
  }
  return cdfs(x, y);
}
int main() {
  scanf("%d", &n), scanf("%d", &m);
  for (int i = 0; i < n; i++) cin >> a[i];
  int d1 = 0, f = 0;
  cycle = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      if (a[i][j] != '#') cycle++;
  int d;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (a[i][j] == '#') {
        for (int k = 0; k < 4; k++) {
          d = dfs(i + di[k], j + dj[k], arrow[k]);
          if (d == d1)
            f = 1;
          else if (d > d1) {
            d1 = d;
            f = 0;
          }
        }
      }
    }
  }
  if (cycle != 0) {
    cout << -1 << endl;
    return 0;
  }
  if (f)
    cout << 2 * d1 << endl;
  else
    cout << 2 * d1 - 1 << endl;
  return 0;
}
