#include <bits/stdc++.h>
using namespace std;
const int N = 2005;
bool can = 1;
char arr[N][N];
int n, m, vis[N][N], dp[N][N];
bool valid(pair<int, int> a) {
  return min(a.first, a.second) > -1 && a.first < n && a.second < m &&
         arr[a.first][a.second] != '#';
}
pair<int, int> get_next(pair<int, int> a) {
  if (arr[a.first][a.second] == '<') return {a.first, a.second - 1};
  if (arr[a.first][a.second] == '>') return {a.first, a.second + 1};
  if (arr[a.first][a.second] == '^') return {a.first - 1, a.second};
  return {a.first + 1, a.second};
}
void dfs(pair<int, int> u) {
  vis[u.first][u.second] = 1;
  pair<int, int> c = get_next(u);
  if (valid(c)) {
    if (vis[c.first][c.second] == 0)
      dfs(c);
    else if (vis[c.first][c.second] == 1) {
      can = 0;
      return;
    }
  }
  vis[u.first][u.second] = 2;
}
bool go(pair<int, int> u) {
  vis[u.first][u.second] = 1;
  pair<int, int> c = get_next(u);
  bool ret = 1;
  if (valid(c)) {
    if (vis[c.first][c.second] == 0)
      ret &= go(c);
    else
      ret = 0;
  }
  return ret;
}
int solve(pair<int, int> u) {
  if (!valid(u)) return 0;
  if (~dp[u.first][u.second]) return dp[u.first][u.second];
  pair<int, int> c = get_next(u);
  return dp[u.first][u.second] = solve(c) + 1;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  memset(dp, -1, sizeof(dp));
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j) cin >> arr[i][j];
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j)
      if (!vis[i][j] && valid({i, j})) dfs({i, j});
  if (can) {
    vector<pair<int, pair<int, int>>> v;
    for (int i = 0; i < n; ++i)
      for (int j = 0; j < m; ++j) v.push_back({solve({i, j}), {i, j}});
    sort(v.rbegin(), v.rend());
    if (v.size() == 1 || v[0].first == 0)
      cout << v[0].first;
    else {
      int ans1 = v[0].first, ans2 = v[0].first - 1;
      memset(vis, 0, sizeof(vis));
      go(v[0].second);
      for (int i = 1; i < v.size(); ++i) {
        if (v[i].first < v[i - 1].first) break;
        if (go(v[i].second)) {
          ans2 = ans1;
          break;
        }
      }
      cout << ans1 + ans2;
    }
  } else
    cout << -1;
  return 0;
}
