#include <bits/stdc++.h>
using namespace std;
const int N = 1003;
char s[N][N];
bool vis[N][N][4];
int xt, yt, xm, ym;
queue<pair<int, pair<int, pair<int, int> > > > q;
bool isL(int x, int y, int z) {
  if (z == 0 && (s[x][y] == '+' || s[x][y] == '<' || s[x][y] == '-' ||
                 s[x][y] == 'R' || s[x][y] == 'U' || s[x][y] == 'D')) {
    return true;
  }
  if (z == 1 && (s[x][y] == '+' || s[x][y] == 'v' || s[x][y] == '|' ||
                 s[x][y] == 'R' || s[x][y] == 'U' || s[x][y] == 'L')) {
    return true;
  }
  if (z == 2 && (s[x][y] == '+' || s[x][y] == '>' || s[x][y] == '-' ||
                 s[x][y] == 'D' || s[x][y] == 'U' || s[x][y] == 'L')) {
    return true;
  }
  if (z == 3 && (s[x][y] == '+' || s[x][y] == '^' || s[x][y] == '|' ||
                 s[x][y] == 'D' || s[x][y] == 'R' || s[x][y] == 'L')) {
    return true;
  }
  return false;
}
bool isR(int x, int y, int z) { return isL(x, y, (z + 2) % 4); }
bool isU(int x, int y, int z) { return isL(x, y, (z + 3) % 4); }
bool isD(int x, int y, int z) { return isL(x, y, (z + 1) % 4); }
void gotoL(int x, int y, int z, int w) {
  if (isL(x, y, z) && isR(x, y - 1, z)) {
    q.push({w + 1, {y - 1, {z, x}}});
  }
}
void gotoR(int x, int y, int z, int w) {
  if (isR(x, y, z) && isL(x, y + 1, z)) {
    q.push({w + 1, {y + 1, {z, x}}});
  }
}
void gotoU(int x, int y, int z, int w) {
  if (isU(x, y, z) && isD(x - 1, y, z)) {
    q.push({w + 1, {y, {z, x - 1}}});
  }
}
void gotoD(int x, int y, int z, int w) {
  if (isD(x, y, z) && isU(x + 1, y, z)) {
    q.push({w + 1, {y, {z, x + 1}}});
  }
}
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%s", s[i]);
  }
  scanf("%d %d\n%d %d", &xt, &yt, &xm, &ym);
  --xt;
  --yt;
  --xm;
  --ym;
  q.push({0, {yt, {0, xt}}});
  q.push({1, {yt, {1, xt}}});
  q.push({2, {yt, {2, xt}}});
  q.push({3, {yt, {3, xt}}});
  while (!q.empty()) {
    auto t = q.front();
    q.pop();
    if (t.second.second.second == xm && t.second.first == ym) {
      printf("%d\n", t.first);
      return 0;
    }
    if (vis[t.second.second.second][t.second.first][t.second.second.first]) {
      continue;
    }
    vis[t.second.second.second][t.second.first][t.second.second.first] = true;
    int z = t.second.second.first, w = t.first;
    if (t.second.second.second > 0 &&
        !vis[t.second.second.second - 1][t.second.first][z]) {
      gotoU(t.second.second.second, t.second.first, z, w);
    }
    if (t.second.second.second < n - 1 &&
        !vis[t.second.second.second + 1][t.second.first][z]) {
      gotoD(t.second.second.second, t.second.first, z, w);
    }
    if (t.second.first > 0 &&
        !vis[t.second.second.second][t.second.first - 1][z]) {
      gotoL(t.second.second.second, t.second.first, z, w);
    }
    if (t.second.first < m - 1 &&
        !vis[t.second.second.second][t.second.first + 1][z]) {
      gotoR(t.second.second.second, t.second.first, z, w);
    }
    z = (t.second.second.first + 1) % 4;
    w = t.first + 1;
    if (!vis[t.second.second.second][t.second.first][z]) {
      q.push({w, {t.second.first, {z, t.second.second.second}}});
    }
  }
  printf("-1");
  return 0;
}
