#include <bits/stdc++.h>
using namespace std;
int len[2000][2000];
int visited[2000][2000];
int last[2000][2000];
int before_last[2000][2000];
int n, m;
inline int ind(int i, int j) { return i * m + j; }
int main() {
  cin >> n >> m;
  vector<string> s(n);
  for (int i = 0; i < n; ++i) {
    cin >> s[i];
  }
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j) {
      last[i][j] = ind(i, j);
      before_last[i][j] = -1;
    }
  vector<pair<int, int> > cand;
  int k = 1;
  for (int i = 1; i < n - 1; ++i) {
    for (int j = 1; j < m - 1; ++j) {
      if (!visited[i][j] && s[i][j] != '#') {
        stack<pair<int, int> > v;
        pair<int, int> cur = make_pair(i, j), last_seen;
        int endmost, before_endmost;
        bool run_into_smth = false;
        while (true) {
          if (visited[cur.first][cur.second] == k) {
            cout << -1;
            return 0;
          }
          if (s[cur.first][cur.second] == '#') {
            last_seen = cur;
            endmost = last[cur.first][cur.second];
            break;
          }
          if (visited[cur.first][cur.second]) {
            run_into_smth = true;
            last_seen = cur;
            endmost = last[cur.first][cur.second];
            before_endmost = before_last[cur.first][cur.second];
            break;
          }
          visited[cur.first][cur.second] = k;
          v.push(cur);
          if (s[cur.first][cur.second] == '>')
            ++cur.second;
          else if (s[cur.first][cur.second] == '<')
            --cur.second;
          else if (s[cur.first][cur.second] == '^')
            --cur.first;
          else
            ++cur.first;
        }
        if (run_into_smth) {
          int d = 1;
          while (!v.empty()) {
            pair<int, int> top = v.top();
            len[top.first][top.second] =
                len[last_seen.first][last_seen.second] + d;
            last[top.first][top.second] = endmost;
            before_last[top.first][top.second] = before_endmost;
            ++d;
            v.pop();
          }
        } else {
          int d = 1;
          pair<int, int> top = v.top();
          before_endmost = ind(top.first, top.second);
          len[top.first][top.second] =
              len[last_seen.first][last_seen.second] + d;
          last[top.first][top.second] = endmost;
          before_last[top.first][top.second] = before_endmost;
          while (!v.empty()) {
            top = v.top();
            len[top.first][top.second] =
                len[last_seen.first][last_seen.second] + d;
            last[top.first][top.second] = endmost;
            before_last[top.first][top.second] = before_endmost;
            ++d;
            v.pop();
          }
        }
        cand.push_back(make_pair(len[i][j], before_endmost));
        ++k;
      }
    }
  }
  if (cand.empty()) {
    cout << 0;
    return 0;
  }
  sort(cand.begin(), cand.end());
  int max_len = cand[cand.size() - 1].first;
  int ans = 2 * cand[cand.size() - 1].first;
  vector<int> ends;
  for (int i = cand.size() - 1; i >= 0 && cand[i].first == max_len; --i)
    ends.push_back(cand[i].second);
  if (count(ends.begin(), ends.end(), ends[0]) == ends.size() &&
      s[ends[0] / m][ends[0] % m])
    --ans;
  cout << ans;
  return 0;
}
