#include <bits/stdc++.h>
#pragma warning(disable : 4996)
using namespace std;
int rmax;
int n, m;
char a[2005][2005];
int q[4000010][3];
int qi;
int d[2005][2005];
int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
pair<int, int> edge[2005][2005];
int inedge[2005][2005];
int p[2005][2005][2];
int isvalid(int x, int y) { return x >= 0 && y >= 0 && x < n && y < m; }
void inf() {
  printf("-1");
  exit(0);
}
void tsort() {
  int i, j, k;
  qi = 0;
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      if (inedge[i][j] == 0) {
        q[qi][0] = i;
        q[qi][1] = j;
        qi++;
      }
    }
  }
  for (i = 0; i < qi; i++) {
    int nowx = q[i][0], nowy = q[i][1];
    if (edge[nowx][nowy].first != -1) {
      int newx = edge[nowx][nowy].first, newy = edge[nowx][nowy].second;
      inedge[newx][newy]--;
      if (inedge[newx][newy] == 0) {
        q[qi][0] = newx;
        q[qi][1] = newy;
        qi++;
      }
    }
  }
  if (qi != n * m) {
    inf();
  }
}
int main() {
  int i, j, k;
  scanf("%d%d", &n, &m);
  for (i = 0; i < n; i++) scanf("%s", a[i]);
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) d[i][j] = -1;
  }
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      edge[i][j] = pair<int, int>(-1, -1);
      if (a[i][j] == '>') {
        edge[i][j] = make_pair(i, j + 1);
        inedge[i][j + 1]++;
      } else if (a[i][j] == '<') {
        edge[i][j] = make_pair(i, j - 1);
        inedge[i][j - 1]++;
      } else if (a[i][j] == '^') {
        edge[i][j] = make_pair(i - 1, j);
        inedge[i - 1][j]++;
      } else if (a[i][j] == 'v') {
        edge[i][j] = make_pair(i + 1, j);
        inedge[i + 1][j]++;
      }
    }
  }
  tsort();
  for (i = qi - 1; i >= 0; i--) {
    int nowx = q[i][0], nowy = q[i][1];
    int max = -1, maxx, maxy;
    if (edge[nowx][nowy].first != -1) {
      int newx = edge[nowx][nowy].first, newy = edge[nowx][nowy].second;
      if (max < d[newx][newy])
        max = d[newx][newy], maxx = p[newx][newy][0], maxy = p[newx][newy][1];
    }
    if (max != -1) {
      if (max != 0)
        d[nowx][nowy] = max + 1, p[nowx][nowy][0] = maxx,
        p[nowx][nowy][1] = maxy;
      else
        d[nowx][nowy] = max + 1, p[nowx][nowy][0] = nowx,
        p[nowx][nowy][1] = nowy;
    } else {
      d[nowx][nowy] = 0;
      p[nowx][nowy][0] = nowx;
      p[nowx][nowy][1] = nowy;
    }
    if (rmax < d[nowx][nowy]) rmax = d[nowx][nowy];
  }
  int max1 = 0, p1, p2;
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      if (max1 < d[i][j]) {
        max1 = d[i][j];
        p1 = p[i][j][0], p2 = p[i][j][1];
      }
    }
  }
  int max2 = 0;
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      if (max2 < d[i][j]) {
        if (max1 == d[i][j] && p[i][j][0] == p1 && p[i][j][1] == p2) continue;
        max2 = d[i][j];
      }
    }
  }
  printf("%d", max1 + max2);
  return 0;
}
