#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
int n, m, k, ans, cnt, tot, flag;
char mp[2005][2005];
bool vis[2005][2005];
int dp[2005][2005];
int nx[2005 * 2005], ny[2005 * 2005];
int dfs(int x, int y) {
  if (dp[x][y] != -1) return dp[x][y];
  int i, j, t, best = 0;
  if (mp[x][y] == '^') {
    if (vis[x - 1][y]) return 0x3f3f3f3f;
    vis[x - 1][y] = 1;
    t = dfs(x - 1, y);
    vis[x - 1][y] = 0;
  } else if (mp[x][y] == 'v') {
    if (vis[x + 1][y]) return 0x3f3f3f3f;
    vis[x + 1][y] = 1;
    t = dfs(x + 1, y);
    vis[x + 1][y] = 0;
  } else if (mp[x][y] == '<') {
    if (vis[x][y - 1]) return 0x3f3f3f3f;
    vis[x][y - 1] = 1;
    t = dfs(x, y - 1);
    vis[x][y - 1] = 0;
  } else if (mp[x][y] == '>') {
    if (vis[x][y + 1]) return 0x3f3f3f3f;
    vis[x][y + 1] = 1;
    t = dfs(x, y + 1);
    vis[x][y + 1] = 0;
  } else
    t = -1;
  dp[x][y] = t + 1;
  return t + 1;
}
void dfs1(int x, int y) {
  if (mp[x][y] == '#') {
    flag = 1;
    return;
  }
  vis[x][y] = 1;
  if (mp[x][y] == '^') {
    if (!vis[x - 1][y]) dfs1(x - 1, y);
  } else if (mp[x][y] == 'v') {
    if (!vis[x + 1][y]) dfs1(x + 1, y);
  } else if (mp[x][y] == '<') {
    if (!vis[x][y - 1]) dfs1(x, y - 1);
  } else if (mp[x][y] == '>') {
    if (!vis[x][y + 1]) dfs1(x, y + 1);
  }
}
void solve() {
  int i, j, t, best = -1;
  cnt = 0;
  memset(dp, -1, sizeof(dp));
  memset(vis, 0, sizeof(vis));
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= m; j++) {
      if (mp[i][j] != '#') {
        vis[i][j] = 1;
        t = dfs(i, j);
        vis[i][j] = 0;
        if (t > best) {
          best = t;
          cnt = 1;
          nx[1] = i, ny[1] = j;
        } else if (t == best) {
          cnt++;
          nx[cnt] = i, ny[cnt] = j;
        }
        if (best >= 0x3f3f3f3f) {
          ans = -1;
          return;
        }
      }
    }
  }
  if (best == -1) {
    ans = 0;
    return;
  }
  memset(vis, 0, sizeof(vis));
  dfs1(nx[1], ny[1]);
  flag = 0;
  for (i = 2; i <= cnt; i++) {
    dfs1(nx[i], ny[i]);
    if (flag) break;
  }
  ans = 2 * best - 1 + flag;
}
int main() {
  int i, j, t;
  while (~scanf("%d%d", &n, &m)) {
    for (i = 1; i <= n; i++) {
      scanf("%s", mp[i] + 1);
    }
    solve();
    printf("%d\n", ans);
  }
  return 0;
}
