#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:100000000000,100000000000")
using namespace std;
const long long inf = 1e18 + 7;
const long long mod = 1e9 + 7;
const double eps = 1e-9;
const double PI = 2 * acos(0.0);
const double E = 2.71828;
int n, m;
int res = 0;
char s[2005][2005];
int f[2005][2005];
int was[2005][2005];
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int symb(char c) {
  if (c == '^') {
    return 3;
  }
  if (c == 'v') {
    return 2;
  }
  if (c == '<') {
    return 1;
  }
  return 0;
}
bool g[2005][2005][4];
int dfs(int x, int y) {
  if (was[x][y]) {
    return f[x][y];
  }
  was[x][y] = 1;
  int &res = f[x][y];
  if (s[x][y] == '#') {
    was[x][y] = 2;
    return res = 0;
  }
  int id = symb(s[x][y]);
  int nx = x + dx[id], ny = y + dy[id];
  if (was[nx][ny] == 1) {
    puts("-1");
    exit(0);
  }
  g[nx][ny][id ^ 1] = true;
  res = dfs(nx, ny) + 1;
  was[x][y] = 2;
  return res;
}
vector<int> w, now;
void go(int x, int y) {
  now.clear();
  for (long long(i) = 0; (i) < (long long)(4); (i)++) {
    int nx = x + dx[i], ny = y + dy[i];
    if (!g[x][y][i]) {
      continue;
    }
    now.push_back(f[nx][ny]);
  }
  sort((now).begin(), (now).end());
  reverse((now).begin(), (now).end());
  if (now.size() >= 2) {
    res = max(res,
              now[0] + now[1] - (now[0] == now[1] && s[x][y] != '#' ? 1 : 0));
  }
  if (now.size() >= 1) {
    res = max(res, 2 * now[0] - 1);
  }
}
int e[2005][2005];
int dfs2(int x, int y) {
  if (was[x][y]) {
    return e[x][y];
  }
  was[x][y] = true;
  int mx = f[x][y];
  for (long long(i) = 0; (i) < (long long)(4); (i)++) {
    int nx = x + dx[i], ny = y + dy[i];
    if (!g[x][y][i]) {
      continue;
    }
    mx = max(mx, dfs2(nx, ny));
  }
  return e[x][y] = mx;
}
int main(void) {
  scanf("%d %d\n", &n, &m);
  for (long long(i) = 0; (i) < (long long)(n); (i)++) {
    gets(s[i]);
  }
  for (long long(i) = 0; (i) < (long long)(n); (i)++) {
    for (long long(j) = 0; (j) < (long long)(m); (j)++) {
      if (!was[i][j]) {
        dfs(i, j);
      }
      res = max(res, 2 * f[i][j] - 1);
    }
  }
  for (long long(i) = 0; (i) < (long long)(n); (i)++) {
    for (long long(j) = 0; (j) < (long long)(m); (j)++) {
      go(i, j);
    }
  }
  memset(was, 0, sizeof was);
  for (long long(i) = 0; (i) < (long long)(n); (i)++) {
    for (long long(j) = 0; (j) < (long long)(m); (j)++) {
      if (f[i][j] == 1 && !was[i][j]) {
        int val = dfs2(i, j);
        res = max(res, 2 * val - 1);
        w.push_back(val);
      }
    }
  }
  sort((w).begin(), (w).end());
  reverse((w).begin(), (w).end());
  if (w.size() >= 2) {
    res = max(res, w[0] + w[1]);
  }
  cout << res << "\n";
  return 0;
}
