#include <bits/stdc++.h>
using namespace std;
string a[(int)(2e3 + 5)];
map<int, char> maX, maY;
int n, m;
int vis[(int)(2e3 + 5)][(int)(2e3 + 5)];
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, -1, 1};
bool chk(int x, int y) {
  if (x >= 0 && y >= 0 && x < n && y < m) return 1;
  return 0;
}
int bfs(int x, int y) {
  int mx = 0;
  queue<pair<int, pair<int, int> > > q;
  q.push(make_pair(0, make_pair(x, y)));
  while (!q.empty()) {
    pair<int, pair<int, int> > temp = q.front();
    q.pop();
    int cur = temp.first;
    mx = max(mx, cur);
    int x = temp.second.first;
    int y = temp.second.second;
    vis[x][y] = 2;
    for (int i = 0; i < 4; i++) {
      int nx = x + dx[i], ny = y + dy[i];
      if (chk(nx, ny)) {
        char ch;
        if (dx[i] == 0) {
          ch = maY[dy[i]];
        } else {
          ch = maX[dx[i]];
        }
        if (a[nx][ny] == ch) {
          q.push(make_pair(cur + 1, make_pair(nx, ny)));
        }
      }
    }
  }
  return mx;
}
int ans1 = 0, ans2 = 0;
void go(int x, int y) {
  vector<int> ans;
  vis[x][y] = 2;
  for (int i = 0; i < 4; i++) {
    char ch;
    if (dx[i] == 0) {
      ch = maY[dy[i]];
    } else {
      ch = maX[dx[i]];
    }
    int nx = x + dx[i], ny = y + dy[i];
    if (chk(nx, ny) && a[nx][ny] == ch) {
      ans.push_back(1 + bfs(nx, ny));
    }
  }
  if (ans.empty()) return;
  int k = ans.size();
  sort(ans.begin(), ans.end());
  if (k == 1) {
    if (ans1 < ans[k - 1]) {
      ans1 = ans[k - 1];
      ans2 = max(ans2, ans[k - 1] - 1);
    } else {
      ans2 = max(ans2, ans[k - 1]);
    }
  } else {
    if (ans1 < ans[k - 1]) {
      ans1 = ans[k - 1];
      ans2 = max(ans2, max(ans[k - 2], ans[k - 1] - 1));
    } else if (ans2 < ans[k - 1]) {
      ans2 = ans[k - 1];
    }
  }
}
void dfs2(int x, int y) {
  vis[x][y] = 1;
  for (int i = 0; i < 4; i++) {
    char ch;
    if (dx[i] == 0) {
      ch = maY[dy[i]];
    } else {
      ch = maX[dx[i]];
    }
    int nx = x + dx[i], ny = y + dy[i];
    if (chk(nx, ny) && a[nx][ny] == ch) {
      if (!vis[nx][ny]) {
        dfs2(nx, ny);
      } else {
        if (vis[nx][ny] == 1) {
          printf("-1");
          exit(0);
        }
      }
    }
  }
  vis[x][y] = 2;
}
void solve() {
  scanf("%d", &n);
  scanf("%d", &m);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  maX[-1] = 'v';
  maX[1] = '^';
  maY[1] = '<';
  maY[-1] = '>';
  int ans = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (a[i][j] == '#') {
        go(i, j);
      }
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (a[i][j] != '#' && !vis[i][j]) dfs2(i, j);
    }
  }
  printf("%d", ans1 + ans2);
}
int main() {
  int t = 1;
  for (int i = 1; i <= t; i++) {
    solve();
  }
  return 0;
}
