#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 3;
const int inf = 1e8;
int n, m;
char str[N][N];
int sx, sy;
int tx, ty;
struct data {
  int up;
  int down;
  int rgt;
  int lft;
  data() {
    up = 0;
    down = 0;
    rgt = 0;
    lft = 0;
  }
  void rotate() {
    int _up = lft;
    int _rgt = up;
    int _down = rgt;
    int _lft = down;
    up = _up;
    rgt = _rgt;
    down = _down;
    lft = _lft;
  }
};
data mat[N][N];
queue<int> qx;
queue<int> qy;
queue<int> qr;
int dist[N][N][4];
inline void relax(int nx, int ny, int nr, int ndist) {
  if (dist[nx][ny][nr] > ndist) {
    dist[nx][ny][nr] = ndist;
    qx.push(nx);
    qy.push(ny);
    qr.push(nr);
  }
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    scanf("%s", str[i] + 1);
  }
  for (int i = 0; i <= m + 1; ++i) {
    str[0][i] = '*';
    str[n + 1][i] = '*';
  }
  for (int i = 0; i <= n + 1; ++i) {
    str[i][0] = '*';
    str[i][m + 1] = '*';
  }
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      if (str[i][j] == '+') {
        mat[i][j].up = 1;
        mat[i][j].lft = 1;
        mat[i][j].rgt = 1;
        mat[i][j].down = 1;
      }
      if (str[i][j] == '-') {
        mat[i][j].up = 0;
        mat[i][j].lft = 1;
        mat[i][j].rgt = 1;
        mat[i][j].down = 0;
      }
      if (str[i][j] == '|') {
        mat[i][j].up = 1;
        mat[i][j].lft = 0;
        mat[i][j].rgt = 0;
        mat[i][j].down = 1;
      }
      if (str[i][j] == '^') {
        mat[i][j].up = 1;
        mat[i][j].lft = 0;
        mat[i][j].rgt = 0;
        mat[i][j].down = 0;
      }
      if (str[i][j] == '>') {
        mat[i][j].up = 0;
        mat[i][j].lft = 0;
        mat[i][j].rgt = 1;
        mat[i][j].down = 0;
      }
      if (str[i][j] == '<') {
        mat[i][j].up = 0;
        mat[i][j].lft = 1;
        mat[i][j].rgt = 0;
        mat[i][j].down = 0;
      }
      if (str[i][j] == 'v') {
        mat[i][j].up = 0;
        mat[i][j].lft = 0;
        mat[i][j].rgt = 0;
        mat[i][j].down = 1;
      }
      if (str[i][j] == 'L') {
        mat[i][j].up = 1;
        mat[i][j].lft = 0;
        mat[i][j].rgt = 1;
        mat[i][j].down = 1;
      }
      if (str[i][j] == 'R') {
        mat[i][j].up = 1;
        mat[i][j].lft = 1;
        mat[i][j].rgt = 0;
        mat[i][j].down = 1;
      }
      if (str[i][j] == 'U') {
        mat[i][j].up = 0;
        mat[i][j].lft = 1;
        mat[i][j].rgt = 1;
        mat[i][j].down = 1;
      }
      if (str[i][j] == 'D') {
        mat[i][j].up = 1;
        mat[i][j].lft = 1;
        mat[i][j].rgt = 1;
        mat[i][j].down = 0;
      }
      if (str[i][j] == '*') {
        mat[i][j].up = 0;
        mat[i][j].lft = 0;
        mat[i][j].rgt = 0;
        mat[i][j].down = 0;
      }
    }
  }
  scanf("%d %d", &sx, &sy);
  scanf("%d %d", &tx, &ty);
  for (int i = 0; i <= n + 1; ++i) {
    for (int j = 0; j <= m + 1; ++j) {
      for (int k = 0; k < 4; ++k) {
        dist[i][j][k] = inf;
      }
    }
  }
  relax(sx, sy, 0, 0);
  while (!qx.empty()) {
    int x = qx.front();
    int y = qy.front();
    int r = qr.front();
    int d = dist[x][y][r];
    qx.pop();
    qy.pop();
    qr.pop();
    relax(x, y, (r + 1) % 4, d + 1);
    data tmp = mat[x][y];
    data tmprgt = mat[x][y + 1];
    data tmpdown = mat[x + 1][y];
    data tmplft = mat[x][y - 1];
    data tmpup = mat[x - 1][y];
    for (int i = 0; i < r; ++i) {
      tmp.rotate();
      tmprgt.rotate();
      tmpdown.rotate();
      tmplft.rotate();
      tmpup.rotate();
    }
    if (tmp.rgt && tmprgt.lft) {
      relax(x, y + 1, r, d + 1);
    }
    if (tmp.lft && tmplft.rgt) {
      relax(x, y - 1, r, d + 1);
    }
    if (tmp.up && tmpup.down) {
      relax(x - 1, y, r, d + 1);
    }
    if (tmp.down && tmpdown.up) {
      relax(x + 1, y, r, d + 1);
    }
  }
  int ans = inf;
  for (int i = 0; i < 4; ++i) {
    ans = min(ans, dist[tx][ty][i]);
  }
  if (ans >= inf) {
    ans = -1;
  }
  printf("%d\n", ans);
}
