#include <bits/stdc++.h>
using namespace std;
char g[4][1001][1001];
bool v[4][1001][1001];
vector<pair<int, int> > mv[128];
struct state {
  int r, c, b, d;
  state() {}
  state(int _r, int _c, int _b, int _d) : r(_r), c(_c), b(_b), d(_d) {}
  bool operator==(state& o) {
    return o.r == r && o.c == c && o.d == d && o.b == b;
  }
};
state pre[4][1001][1001];
int n, m;
char rotc[128];
int main() {
  mv['+'] = {pair<int, int>(1, 0), pair<int, int>(-1, 0), pair<int, int>(0, 1),
             pair<int, int>(0, -1)};
  mv['-'] = {pair<int, int>(0, 1), pair<int, int>(0, -1)};
  mv['|'] = {pair<int, int>(1, 0), pair<int, int>(-1, 0)};
  mv['^'] = {pair<int, int>(-1, 0)};
  mv['>'] = {pair<int, int>(0, 1)};
  mv['<'] = {pair<int, int>(0, -1)};
  mv['v'] = {pair<int, int>(1, 0)};
  mv['L'] = {pair<int, int>(1, 0), pair<int, int>(-1, 0), pair<int, int>(0, 1)};
  mv['R'] = {pair<int, int>(1, 0), pair<int, int>(-1, 0),
             pair<int, int>(0, -1)};
  mv['U'] = {pair<int, int>(1, 0), pair<int, int>(0, 1), pair<int, int>(0, -1)};
  mv['D'] = {pair<int, int>(-1, 0), pair<int, int>(0, 1),
             pair<int, int>(0, -1)};
  rotc['+'] = '+', rotc['-'] = '|', rotc['|'] = '-', rotc['^'] = '>',
  rotc['>'] = 'v', rotc['v'] = '<', rotc['<'] = '^', rotc['L'] = 'U',
  rotc['U'] = 'R', rotc['R'] = 'D', rotc['D'] = 'L', rotc['*'] = '*';
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%s", g[0][i]);
  }
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < n; j++)
      for (int k = 0; k < m; k++) g[i + 1][j][k] = rotc[g[i][j][k]];
  }
  int sr, sc, tr, tc;
  scanf("%d %d %d %d", &sr, &sc, &tr, &tc);
  sr--, sc--, tr--, tc--;
  queue<state> q;
  q.push(state(sr, sc, 0, 0));
  pre[0][sr][sc] = state(sr, sc, 0, 0);
  v[0][sr][sc] = 1;
  int ans = -1;
  while (!q.empty()) {
    state x = q.front();
    q.pop();
    if (x.r == tr && x.c == tc) {
      ans = x.d;
      break;
    }
    int rot = (x.b + 1) % 4;
    if (!v[rot][x.r][x.c]) {
      v[rot][x.r][x.c] = 1;
      pre[rot][x.r][x.c] = x;
      q.push(state(x.r, x.c, rot, x.d + 1));
    }
    int c = g[x.b][x.r][x.c];
    for (int i = 0; i < mv[c].size(); i++) {
      int nr = x.r + mv[c][i].first, nc = x.c + mv[c][i].second;
      if (nr >= 0 && nr < n && nc >= 0 && nc < m && !v[x.b][nr][nc]) {
        vector<pair<int, int> >& mm = mv[g[x.b][nr][nc]];
        bool f = false;
        for (int j = 0; j < mm.size(); j++) {
          if (nr + mm[j].first == x.r && nc + mm[j].second == x.c) {
            f = true;
            break;
          }
        }
        if (!f) continue;
        v[x.b][nr][nc] = true;
        pre[x.b][nr][nc] = x;
        q.push(state(nr, nc, x.b, x.d + 1));
      }
    }
  }
  printf("%d\n", ans);
  return 0;
}
