#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:96777216")
using namespace std;
const int INF = 1000000000;
int main() {
  int N, M;
  cin >> N >> M;
  char **S = new char *[N];
  for (int i = 0; i < N; i++) S[i] = new char[M];
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++) cin >> S[i][j];
  int count = 0;
  int **d = new int *[N];
  for (int i = 0; i < N; i++) d[i] = new int[M];
  queue<pair<int, int>> q;
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++) d[i][j] = INF;
  pair<int, int> **f = new pair<int, int> *[N];
  for (int i = 0; i < N; i++) f[i] = new pair<int, int>[M];
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++) {
      if (S[i][j] != '#') count++;
      if (S[i][j] == '<' && S[i][j - 1] == '#') {
        q.push(make_pair(i, j - 1));
        f[i][j] = make_pair(i, j);
        d[i][j - 1] = 0;
      }
      if (S[i][j] == '>' && S[i][j + 1] == '#') {
        q.push(make_pair(i, j + 1));
        f[i][j] = make_pair(i, j);
        d[i][j + 1] = 0;
      }
      if (S[i][j] == '^' && S[i - 1][j] == '#') {
        q.push(make_pair(i - 1, j));
        f[i][j] = make_pair(i, j);
        d[i - 1][j] = 0;
      }
      if (S[i][j] == 'v' && S[i + 1][j] == '#') {
        q.push(make_pair(i + 1, j));
        f[i][j] = make_pair(i, j);
        d[i + 1][j] = 0;
      }
    }
  if (count == 1) {
    cout << 0;
    return 0;
  }
  if (q.empty()) {
    if (count)
      cout << -1;
    else
      cout << 0;
    return 0;
  }
  while (!q.empty()) {
    pair<int, int> v = q.front();
    int i = v.first, j = v.second;
    q.pop();
    if (j && S[i][j - 1] == '>' && d[i][j - 1] == INF) {
      q.push(make_pair(i, j - 1));
      d[i][j - 1] = d[i][j] + 1;
      if (S[i][j] != '#') f[i][j - 1] = f[i][j];
    }
    if (j != M - 1 && S[i][j + 1] == '<' && d[i][j + 1] == INF) {
      q.push(make_pair(i, j + 1));
      d[i][j + 1] = d[i][j] + 1;
      if (S[i][j] != '#') f[i][j + 1] = f[i][j];
    }
    if (i != N - 1 && S[i + 1][j] == '^' && d[i + 1][j] == INF) {
      q.push(make_pair(i + 1, j));
      d[i + 1][j] = d[i][j] + 1;
      if (S[i][j] != '#') f[i + 1][j] = f[i][j];
    }
    if (i && S[i - 1][j] == 'v' && d[i - 1][j] == INF) {
      q.push(make_pair(i - 1, j));
      d[i - 1][j] = d[i][j] + 1;
      if (S[i][j] != '#') f[i - 1][j] = f[i][j];
    }
  }
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++) {
      if (S[i][j] != '#' && d[i][j] == INF) {
        cout << -1;
        return 0;
      }
    }
  vector<pair<int, int>> ans;
  int max_d = -1;
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++) {
      if (d[i][j] == INF) continue;
      if (d[i][j] == max_d) ans.push_back(make_pair(i, j));
      if (d[i][j] > max_d) {
        max_d = d[i][j];
        ans.clear();
        ans.push_back(make_pair(i, j));
      }
    }
  if (ans.size() == 1) {
    cout << 2 * max_d - 1;
    return 0;
  }
  pair<int, int> finish = f[ans[0].first][ans[0].second];
  for (int i = 0; i < (int)ans.size(); i++) {
    if (f[ans[i].first][ans[i].second] != finish) {
      cout << 2 * max_d;
      return 0;
    }
  }
  cout << 2 * max_d - 1;
  return 0;
}
