#include <bits/stdc++.h>
using namespace std;
const int MAX = 1002;
int vx[4] = {-1, 0, 1, 0};
int vy[4] = {0, 1, 0, -1};
int p[4] = {2, 3, 0, 1};
int ans[MAX][MAX][10], result, M, N, a[10][MAX][MAX], sx, sy, tx, ty;
char str[MAX];
priority_queue<pair<int, pair<pair<int, int>, int> >,
               vector<pair<int, pair<pair<int, int>, int> > >,
               greater<pair<int, pair<pair<int, int>, int> > > >
    q;
int inside(int x, int y) { return (0 <= x && x < M && 0 <= y && y < N); }
int rotateBlock(int src) {
  int bit = (src >> 3) & 1;
  src = (src & (~8));
  src = (src << 1) | bit;
  return src;
}
int getBit(int status, int i) { return (status >> i) & 1; }
int main() {
  scanf("%d %d", &M, &N);
  for (int i = 0; i < M; ++i) {
    scanf("%s", str);
    for (int j = 0; j < N; ++j) {
      if (str[j] == '+')
        a[0][i][j] = 1 + 2 + 4 + 8;
      else if (str[j] == '-')
        a[0][i][j] = 2 + 8;
      else if (str[j] == '|')
        a[0][i][j] = 1 + 4;
      else if (str[j] == '^')
        a[0][i][j] = 1;
      else if (str[j] == '>')
        a[0][i][j] = 2;
      else if (str[j] == 'v')
        a[0][i][j] = 4;
      else if (str[j] == '<')
        a[0][i][j] = 8;
      else if (str[j] == 'L')
        a[0][i][j] = 1 + 2 + 4;
      else if (str[j] == 'R')
        a[0][i][j] = 1 + 4 + 8;
      else if (str[j] == 'U')
        a[0][i][j] = 2 + 4 + 8;
      else if (str[j] == 'D')
        a[0][i][j] = 1 + 2 + 8;
      else
        a[0][i][j] = 0;
    }
  }
  for (int i = 1; i < 4; ++i)
    for (int x = 0; x < M; ++x)
      for (int y = 0; y < N; ++y) a[i][x][y] = rotateBlock(a[i - 1][x][y]);
  for (int i = 0; i < 4; ++i)
    for (int x = 0; x < M; ++x)
      for (int y = 0; y < N; ++y) ans[x][y][i] = 1E9;
  scanf("%d %d", &sx, &sy);
  --sx;
  --sy;
  scanf("%d %d", &tx, &ty);
  --tx;
  --ty;
  q.push(make_pair(0, make_pair(make_pair(sx, sy), 0)));
  ans[sx][sy][0] = 0;
  while (!q.empty()) {
    int dist = q.top().first;
    int x = q.top().second.first.first, nx;
    int y = q.top().second.first.second, ny;
    int z = q.top().second.second, nz;
    q.pop();
    if (dist > ans[x][y][z]) continue;
    for (int times = 0; times < 4; ++times) {
      nz = (z + times) % 4;
      for (int i = 0; i < 4; ++i) {
        nx = x + vx[i];
        ny = y + vy[i];
        if (!inside(nx, ny)) continue;
        if (getBit(a[nz][x][y], i) == 0 || getBit(a[nz][nx][ny], p[i]) == 0)
          continue;
        if (dist + times + 1 >= ans[nx][ny][nz]) continue;
        ans[nx][ny][nz] = ans[x][y][z] + times + 1;
        q.push(make_pair(ans[nx][ny][nz], make_pair(make_pair(nx, ny), nz)));
      }
    }
  }
  result = 1E9;
  for (int i = 0; i < 4; ++i)
    if (ans[tx][ty][i] != -1) result = min(result, ans[tx][ty][i]);
  printf("%d", (result != 1E9) ? result : -1);
  return 0;
}
