#include <bits/stdc++.h>
using namespace std;
const int maxN = 2000 + 5;
const int mod = 1000 * 1000 * 1000 + 9;
char c[maxN][maxN];
int mark[maxN][maxN];
int dp[maxN][maxN], dis[maxN][maxN];
vector<pair<int, int> > a[maxN][maxN];
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
char v[] = {'^', 'v', '<', '>'};
int bes;
void dfs(int x, int y) {
  mark[x][y] = 1;
  vector<int> vr;
  for (auto u : a[x][y]) {
    int xp = u.first, yp = u.second;
    if (mark[xp][yp] == 1) {
      cout << -1 << endl;
      exit(0);
    }
    if (mark[xp][yp] == 0) dfs(xp, yp);
    if (dp[xp][yp] > -1) dp[x][y] = max(dp[x][y], dp[xp][yp] + 2);
    vr.push_back(dis[xp][yp] + 1);
    sort(vr.begin(), vr.end(), greater<int>());
    if (vr.size() > 2) vr.pop_back();
  }
  if (vr.size() == 2) {
    dp[x][y] = max(dp[x][y], vr[0] + vr[1] - (vr[0] == vr[1]));
    if (c[x][y] == '#') dp[x][y] = max(dp[x][y], vr[0] + vr[1]);
  } else if (vr.size() == 1)
    dp[x][y] = max(dp[x][y], vr[0]);
  if (vr.size()) dis[x][y] = max(dis[x][y], vr[0]);
  mark[x][y] = 2;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  memset(dp, -1, sizeof dp);
  for (int i = 0; i < n; i++) scanf("%s", &c[i]);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      if (c[i][j] == '#') continue;
      int vr = i, ur = j;
      for (int k = 0; k < 4; k++)
        if (c[i][j] == v[k]) vr += dx[k], ur += dy[k];
      a[vr][ur].push_back({i, j});
    }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      if (!mark[i][j]) dfs(i, j);
    }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) bes = max(bes, dp[i][j]);
  vector<int> xx;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      xx.push_back(dis[i][j]);
      sort(xx.begin(), xx.end(), greater<int>());
      if (xx.size() > 2) xx.pop_back();
    }
  if (xx.size() == 2) bes = max(bes, xx[0] + xx[1]);
  printf("%d\n", bes);
  return 0;
}
