#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:100000000000000")
using namespace std;
const long long int INF = 2e9;
char mine[2010][2010];
int used[2010][2010];
int h[2010][2010];
char ss[4] = {'>', '<', '^', 'v'};
pair<int, int> gone[4] = {make_pair(0, 1), make_pair(0, -1), make_pair(-1, 0),
                          make_pair(1, 0)};
bool cycle = false;
vector<pair<int, int> > g[2010][2010];
pair<pair<int, int>, int> upper[2010 * 2010];
int temp[2010][2010][2];
int ptr = 0;
inline void dfs(int x, int y) {
  ptr = -1;
  ptr++;
  upper[ptr] = make_pair(make_pair(x, y), 0);
begi:;
  if (ptr < 0) return;
  x = upper[ptr].first.first;
  y = upper[ptr].first.second;
  int i = upper[ptr].second;
  used[x][y] = 1;
  if (i < 4) {
    upper[ptr].second++;
    if (mine[x][y] == ss[i]) {
      int tox = x + gone[i].first;
      int toy = y + gone[i].second;
      g[tox][toy].push_back(make_pair(x, y));
      if (used[tox][toy] == 1) cycle = true;
      if (!used[tox][toy]) {
        ptr++;
        upper[ptr] = make_pair(make_pair(tox, toy), 0);
        goto begi;
      }
    }
    goto begi;
  }
  used[x][y] = 2;
  ptr--;
  goto begi;
}
int out = 0;
int other = 0;
inline void dfs2(int x, int y) {
  ptr = -1;
  upper[++ptr] = make_pair(make_pair(x, y), 0);
begi2:;
  if (ptr < 0) return;
  x = upper[ptr].first.first;
  y = upper[ptr].first.second;
  int i = upper[ptr].second;
  used[x][y] = 1;
  if (i < (int)(g[x][y]).size()) {
    int tox = g[x][y][i].first;
    int toy = g[x][y][i].second;
    upper[ptr].second++;
    if (used[tox][toy] == 1) goto begi2;
    if (!used[tox][toy]) {
      upper[ptr].second--;
      ptr++;
      upper[ptr] = make_pair(make_pair(tox, toy), 0);
      goto begi2;
    }
    if (h[tox][toy] + 1 > temp[x][y][0]) {
      temp[x][y][1] = temp[x][y][0];
      temp[x][y][0] = h[tox][toy] + 1;
    } else if (h[tox][toy] + 1 > temp[x][y][1]) {
      temp[x][y][1] = h[tox][toy] + 1;
    }
    h[x][y] = max(h[x][y], h[tox][toy] + 1);
    goto begi2;
  }
  out = max(out, h[x][y] + other);
  other = max(other, h[x][y]);
  out = max(out, h[x][y] * 2 - 1);
  if (mine[x][y] == '#') {
    out = max(out, temp[x][y][0] + temp[x][y][1]);
  }
  used[x][y] = 2;
  ptr--;
  goto begi2;
}
int main() {
  int n, m;
  cin >> n >> m;
  if (n == 1 && m == 1) {
    cout << 0;
    return 0;
  }
  for (int i = 0; i < (n); i++) {
    scanf("%s", &mine[i]);
  }
  memset(used, 0, sizeof used);
  memset(h, 0, sizeof h);
  memset(temp, 0, sizeof temp);
  for (int i = 0; i < (n); i++)
    for (int j = 0; j < (m); j++) {
      if (!used[i][j]) dfs(i, j);
    }
  if (cycle)
    cout << -1;
  else {
    memset(used, 0, sizeof used);
    for (int i = 0; i < (n); i++)
      for (int j = 0; j < (m); j++) {
        if (!used[i][j] && mine[i][j] == '#') dfs2(i, j);
      }
    cout << out;
  }
}
