#include <bits/stdc++.h>
using namespace std;
const int maxN = 2000;
const int maxM = 2000;
char a[maxN][maxM];
int kq[maxN][maxM];
int n, m;
int cal(int x, int y) {
  if (kq[x][y] >= 0) return kq[x][y];
  kq[x][y] = 0;
  switch (a[x][y]) {
    case '#':
      return 0;
      break;
    case '>':
      return kq[x][y] = cal(x, y + 1) + 1;
      break;
    case '<':
      return kq[x][y] = cal(x, y - 1) + 1;
      break;
    case '^':
      return kq[x][y] = cal(x - 1, y) + 1;
      break;
    case 'v':
      return kq[x][y] = cal(x + 1, y) + 1;
      break;
  }
}
bool ktvong() {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      int x, y;
      switch (a[i][j]) {
        case '>': {
          x = i;
          y = j + 1;
          if (kq[x][y] > kq[i][j]) return true;
          break;
        }
        case '<': {
          x = i;
          y = j - 1;
          if (kq[x][y] > kq[i][j]) return true;
          break;
        }
        case '^': {
          x = i - 1;
          y = j;
          if (kq[x][y] > kq[i][j]) return true;
          break;
        }
        case 'v': {
          x = i + 1;
          y = j;
          if (kq[x][y] > kq[i][j]) return true;
          break;
        }
      }
    }
  return false;
}
bool kt(int x) {
  queue<int> hd1, hd2;
  int sl = 0;
  while (!hd1.empty()) hd1.pop();
  while (!hd2.empty()) hd2.pop();
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      if (kq[i][j] == x) {
        ++sl;
        hd1.push(i);
        hd2.push(j);
        kq[i][j] = 1;
      } else
        kq[i][j] = 0;
  while (!hd1.empty()) {
    int x = hd1.front(), y = hd2.front();
    hd1.pop();
    hd2.pop();
    int xx, yy;
    if (kq[x][y] == sl && a[x][y] != '#') return false;
    switch (a[x][y]) {
      case '#':
        return true;
        break;
      case '>':
        xx = x;
        yy = y + 1;
        break;
      case '<':
        xx = x;
        yy = y - 1;
        break;
      case '^':
        xx = x - 1;
        yy = y;
        break;
      case 'v':
        xx = x + 1;
        yy = y;
        break;
    }
    if (kq[xx][yy] == 0) {
      hd1.push(xx);
      hd2.push(yy);
    }
    kq[xx][yy] += kq[x][y];
  }
  return false;
}
int main() {
  scanf("%i%i\n", &n, &m);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) scanf("%c", &a[i][j]);
    scanf("\n");
  }
  memset(kq, 255, sizeof(kq));
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      if (kq[i][j] == -1) kq[i][j] = cal(i, j);
  if (ktvong()) {
    cout << -1;
    return 0;
  }
  int m1 = 0, m2 = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      if (kq[i][j] > m1) {
        m2 = m1;
        m1 = kq[i][j];
      } else if (kq[i][j] > m2)
        m2 = kq[i][j];
    }
  if (kt(m1))
    m2 = m1;
  else
    m2 = m1 - 1;
  printf("%i", m1 + m2);
  return 0;
}
