#include <bits/stdc++.h>
using namespace std;
const int N = 2e3 + 7;
int n, m;
char M[N][N];
int dp[N][N];
int getdp(int x, int y, int dep) {
  if (dep > 4000000) {
    cout << -1 << "\n";
    exit(0);
  }
  if (dp[x][y] != -1) return dp[x][y];
  if (M[x][y] == '#' || M[x][y] == 0) return dp[x][y] = 0;
  if (M[x][y] == '^') return dp[x][y] = getdp(x - 1, y, dep + 1) + 1;
  if (M[x][y] == 'v') return dp[x][y] = getdp(x + 1, y, dep + 1) + 1;
  if (M[x][y] == '<') return dp[x][y] = getdp(x, y - 1, dep + 1) + 1;
  if (M[x][y] == '>') return dp[x][y] = getdp(x, y + 1, dep + 1) + 1;
  return 0;
}
int solve() {
  memset(dp, -1, sizeof dp);
  pair<int, int> Max = make_pair(1, 1);
  for (int i = (1); i < (n + 1); ++i)
    for (int j = (1); j < (m + 1); ++j) {
      dp[i][j] = getdp(i, j, 0);
      if (dp[i][j] > dp[Max.first][Max.second]) Max = make_pair(i, j);
    }
  int ans = dp[Max.first][Max.second];
  while (dp[Max.first][Max.second]) {
    char s = M[Max.first][Max.second];
    M[Max.first][Max.second] = '#';
    if (s == '^') Max.first--;
    if (s == 'v') Max.first++;
    if (s == '<') Max.second--;
    if (s == '>') Max.second++;
  }
  return ans;
}
int main() {
  std::ios::sync_with_stdio(0);
  std::cin.tie(0);
  cin >> n >> m;
  for (int i = (1); i < (n + 1); ++i) cin >> (M[i] + 1);
  int res = solve();
  cout << res + max(solve(), res - 1);
}
