#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > g;
vector<int> dp;
vector<char> clr;
int R, C;
bool cyc = false;
char v[2000][2001];
inline int idx(int r, int c) { return r * C + c; }
void DFS(int u) {
  if (clr[u] == 2) return;
  if (clr[u] == 1) {
    cyc = true;
    return;
  }
  clr[u] = 1;
  for (int i = 0; !cyc && i < g[u].size(); ++i) DFS(g[u][i]);
  clr[u] = 2;
}
int calc(int u) {
  if (dp[u] != -1) return dp[u];
  dp[u] = 0;
  for (int i = 0; i < g[u].size(); ++i) dp[u] = max(dp[u], 1 + calc(g[u][i]));
  return dp[u];
}
int main() {
  scanf("%d%d", &R, &C);
  bool all = true;
  for (int i = 0; i < R; ++i) {
    scanf("%s", v[i]);
    for (int j = 0; all && j < C; ++j)
      if (v[i][j] != '#') all = false;
  }
  if (all) {
    puts("0");
    return 0;
  }
  g.resize(R * C);
  clr.resize(R * C, 0);
  dp.resize(R * C, -1);
  for (int i = 0; i < R; ++i)
    for (int j = 0; j < C; ++j)
      if (v[i][j] == '<') {
        g[idx(i, j)].push_back(idx(i, j - 1));
      } else if (v[i][j] == '>') {
        g[idx(i, j)].push_back(idx(i, j + 1));
      } else if (v[i][j] == '^') {
        g[idx(i, j)].push_back(idx(i - 1, j));
      } else if (v[i][j] == 'v') {
        g[idx(i, j)].push_back(idx(i + 1, j));
      }
  for (int i = 0; !cyc && i < R; ++i)
    for (int j = 0; !cyc && j < C; ++j)
      if (v[i][j] != '#' && clr[idx(i, j)] == 0) DFS(idx(i, j));
  if (cyc) {
    puts("-1");
    return 0;
  }
  g.clear();
  g.resize(R * C);
  for (int i = 0; i < R; ++i)
    for (int j = 0; j < C; ++j)
      if (v[i][j] == '<') {
        g[idx(i, j - 1)].push_back(idx(i, j));
      } else if (v[i][j] == '>') {
        g[idx(i, j + 1)].push_back(idx(i, j));
      } else if (v[i][j] == '^') {
        g[idx(i - 1, j)].push_back(idx(i, j));
      } else if (v[i][j] == 'v') {
        g[idx(i + 1, j)].push_back(idx(i, j));
      }
  int sol = 0;
  vector<int> tmp;
  priority_queue<int> q;
  for (int i = 0; i < g.size(); ++i)
    if (v[i / C][i % C] == '#' && g[i].size()) {
      q.push(-calc(i));
      if (q.size() == 3) q.pop();
      tmp.clear();
      for (int j = 0; j < g[i].size(); ++j) tmp.push_back(calc(g[i][j]));
      sort(tmp.begin(), tmp.end());
      reverse(tmp.begin(), tmp.end());
      if (tmp.size() > 1) sol = max(sol, tmp[0] + tmp[1] + 2);
    }
  int len1 = -q.top();
  q.pop();
  sol = max(sol, len1 * 2 - 1);
  int len2 = 0;
  if (q.size()) len2 = -q.top();
  sol = max(sol, len2 * 2 - 1);
  sol = max(sol, len1 + len2);
  printf("%d\n", sol);
  return 0;
}
