#include <bits/stdc++.h>
using namespace std;
pair<int, int> U = make_pair(-1, 0), D = make_pair(1, 0), L = make_pair(0, -1),
               R = make_pair(0, 1);
struct State {
  int x, y, k;
  State() {}
  State(int x, int y, int k) : x(x), y(y), k(k) {}
};
int n, m, dp[1009][1009][4], sx, sy, tx, ty, con[300][300][5][10];
char st[1009][1009];
vector<pair<int, int> > all, hor, ver, nul;
void init() {
  all.push_back(U);
  all.push_back(D);
  all.push_back(L);
  all.push_back(R);
  hor.push_back(L);
  hor.push_back(R);
  ver.push_back(U);
  ver.push_back(D);
}
vector<pair<int, int> > dirs(char ch, int rot) {
  if (ch == '*') return nul;
  if (ch == '+') return all;
  if (ch == '-') return (rot % 2 == 0) ? hor : ver;
  if (ch == '|') return (rot % 2 == 1) ? hor : ver;
  vector<pair<int, int> > ret;
  if (ch == '^' || ch == '>' || ch == '<' || ch == 'v') {
    if (ch == '^') {
      if (rot == 0) ret.push_back(U);
      if (rot == 1) ret.push_back(R);
      if (rot == 2) ret.push_back(D);
      if (rot == 3) ret.push_back(L);
    }
    if (ch == '>') {
      if (rot == 0) ret.push_back(R);
      if (rot == 1) ret.push_back(D);
      if (rot == 2) ret.push_back(L);
      if (rot == 3) ret.push_back(U);
    }
    if (ch == 'v') {
      if (rot == 0) ret.push_back(D);
      if (rot == 1) ret.push_back(L);
      if (rot == 2) ret.push_back(U);
      if (rot == 3) ret.push_back(R);
    }
    if (ch == '<') {
      if (rot == 0) ret.push_back(L);
      if (rot == 1) ret.push_back(U);
      if (rot == 2) ret.push_back(R);
      if (rot == 3) ret.push_back(D);
    }
  }
  if (ch == 'L' || ch == 'R' || ch == 'U' || ch == 'D') {
    if (ch == 'U') {
      if (rot != 0) ret.push_back(U);
      if (rot != 1) ret.push_back(R);
      if (rot != 2) ret.push_back(D);
      if (rot != 3) ret.push_back(L);
    }
    if (ch == 'R') {
      if (rot != 0) ret.push_back(R);
      if (rot != 1) ret.push_back(D);
      if (rot != 2) ret.push_back(L);
      if (rot != 3) ret.push_back(U);
    }
    if (ch == 'D') {
      if (rot != 0) ret.push_back(D);
      if (rot != 1) ret.push_back(L);
      if (rot != 2) ret.push_back(U);
      if (rot != 3) ret.push_back(R);
    }
    if (ch == 'L') {
      if (rot != 0) ret.push_back(L);
      if (rot != 1) ret.push_back(U);
      if (rot != 2) ret.push_back(R);
      if (rot != 3) ret.push_back(D);
    }
  }
  return ret;
}
bool connected(char c1, char c2, int k, pair<int, int> d) {
  int &ret = con[c1][c2][k][(d.first + 1) * 3 + (d.second + 1)];
  if (ret != 0) return (ret > 0);
  vector<pair<int, int> > dir = dirs(c2, k);
  for (int i = 0; i < (dir.size()); i++)
    if (d.first + dir[i].first == 0 && d.second + dir[i].second == 0)
      return (ret = 1);
  ret = -1;
  return false;
}
int BFS() {
  queue<State> Q;
  Q.push(State(sx, sy, 0));
  memset(dp, -1, sizeof(dp));
  dp[sx][sy][0] = 0;
  while (!Q.empty()) {
    State cur = Q.front();
    Q.pop();
    int cx = cur.x, cy = cur.y, ck = cur.k;
    int curT = dp[cx][cy][ck];
    if (cx == tx && cy == ty) return curT;
    if (dp[cx][cy][(ck + 1) % 4] < 0) {
      dp[cx][cy][(ck + 1) % 4] = curT + 1;
      Q.push(State(cx, cy, (ck + 1) % 4));
    }
    vector<pair<int, int> > d = dirs(st[cx][cy], ck);
    for (int i = 0; i < (d.size()); i++) {
      int nx = cx + d[i].first, ny = cy + d[i].second;
      if (nx < 1 || ny < 1 || nx > n || ny > m) continue;
      if (!connected(st[cx][cy], st[nx][ny], ck, d[i])) continue;
      if (dp[nx][ny][ck] < 0) {
        dp[nx][ny][ck] = curT + 1;
        Q.push(State(nx, ny, ck));
      }
    }
  }
  return -1;
}
int main() {
  init();
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= (n); i++) scanf("%s", st[i] + 1);
  scanf("%d%d", &sx, &sy);
  scanf("%d%d", &tx, &ty);
  printf("%d\n", BFS());
  return 0;
}
