#include <bits/stdc++.h>
using namespace std;
const int nmax = 2005;
int n, m;
int u[nmax][nmax];
int d[nmax][nmax];
char s[nmax][nmax];
char moves[256][2];
int df(int x, int y) {
  if (s[x][y] == '#') return d[x][y] = 0;
  if (u[x][y]) return d[x][y];
  u[x][y] = 1;
  int dx = moves[s[x][y]][0], dy = moves[s[x][y]][1];
  if (u[x + dx][y + dy] == 1) {
    printf("-1\n");
    exit(0);
  }
  d[x][y] = df(x + dx, y + dy) + 1;
  u[x][y] = 2;
  return d[x][y];
}
void dfremove(int x, int y) {
  if (s[x][y] == '#') return;
  int dx = moves[s[x][y]][0], dy = moves[s[x][y]][1];
  dfremove(x + dx, y + dy);
  s[x][y] = '#';
}
pair<int, int> getmax() {
  int ansi, ansj, ans = -1;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (u[i][j] == 0) continue;
      if (d[i][j] > ans) ans = d[i][j], ansi = i, ansj = j;
    }
  }
  if (ans == -1) return make_pair(1, 1);
  return make_pair(ansi, ansj);
}
int main() {
  moves['<'][0] = 0;
  moves['<'][1] = -1;
  moves['>'][0] = 0;
  moves['>'][1] = 1;
  moves['v'][0] = 1;
  moves['v'][1] = 0;
  moves['^'][0] = -1;
  moves['^'][1] = 0;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%s", s[i] + 1);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      d[i][j] = df(i, j);
    }
  pair<int, int> pmax = getmax();
  int dmax = d[pmax.first][pmax.second];
  dfremove(pmax.first, pmax.second);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) u[i][j] = d[i][j] = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      df(i, j);
    }
  }
  pair<int, int> pmax2 = getmax();
  int dmax2 = d[pmax2.first][pmax2.second];
  printf("%d\n", max(dmax + dmax2, dmax * 2 - 1));
  return 0;
}
