#include <bits/stdc++.h>
using namespace std;
const int MAXN = 101 * 1001;
short r[300];
vector<pair<pair<short, short>, short> > adj[1005][1005][4];
int dis[1005][1005][4] = {};
bool a[300][4] = {};
char s[1005][1005] = {};
void init1() {
  r[(int)'*'] = '*';
  r[(int)'+'] = '+';
  r[(int)'-'] = '|';
  r[(int)'|'] = '-';
  r[(int)'^'] = '>';
  r[(int)'>'] = 'v';
  r[(int)'v'] = '<';
  r[(int)'<'] = '^';
  r[(int)'L'] = 'U';
  r[(int)'U'] = 'R';
  r[(int)'R'] = 'D';
  r[(int)'D'] = 'L';
  a[(int)'+'][0] = a[(int)'+'][1] = a[(int)'+'][2] = a[(int)'+'][3] = 1;
  a[(int)'-'][1] = a[(int)'-'][3] = 1;
  a[(int)'|'][0] = a[(int)'|'][2] = 1;
  a[(int)'^'][0] = 1;
  a[(int)'>'][1] = 1;
  a[(int)'v'][2] = 1;
  a[(int)'<'][3] = 1;
  a[(int)'L'][0] = a[(int)'L'][1] = a[(int)'L'][2] = 1;
  a[(int)'U'][1] = a[(int)'U'][2] = a[(int)'U'][3] = 1;
  a[(int)'R'][0] = a[(int)'R'][2] = a[(int)'R'][3] = 1;
  a[(int)'D'][0] = a[(int)'D'][1] = a[(int)'D'][3] = 1;
}
inline void f(short x1, short y1, short x2, short y2, short z, short n,
              short m) {
  if (x2 == n || y2 == m) return;
  if (x1 + 1 == x2) {
    if (a[s[x1][y1]][2] && a[s[x2][y2]][0]) {
      adj[x1][y1][z].push_back({{x2, y2}, z});
      adj[x2][y2][z].push_back({{x1, y1}, z});
    }
  } else {
    if (a[s[x1][y1]][1] && a[s[x2][y2]][3]) {
      adj[x1][y1][z].push_back({{x2, y2}, z});
      adj[x2][y2][z].push_back({{x1, y1}, z});
    }
  }
}
queue<short> q;
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  init1();
  short n, m;
  cin >> n >> m;
  for (short i = 0; i < n; i++)
    for (short j = 0; j < m; j++) cin >> s[i][j];
  for (short z = 0; z < 4; z++) {
    for (short i = 0; i < n; i++)
      for (short j = 0; j < m; j++) {
        f(i, j, i + 1, j, z, n, m);
        f(i, j, i, j + 1, z, n, m);
      }
    for (short i = 0; i < n; i++)
      for (short j = 0; j < m; j++) s[i][j] = r[s[i][j]], dis[i][j][z] = 1e9;
  }
  short x1, y1, x2, y2;
  cin >> x1 >> y1 >> x2 >> y2;
  x1--;
  x2--;
  y1--;
  y2--;
  q.push(x1);
  q.push(y1);
  q.push(0);
  dis[x1][y1][0] = 0;
  short x, y, z, xx, yx, zx;
  while (q.size()) {
    x = q.front(), q.pop();
    y = q.front(), q.pop();
    z = q.front(), q.pop();
    for (auto u : adj[x][y][z]) {
      xx = u.first.first;
      yx = u.first.second;
      zx = u.second;
      if (dis[xx][yx][zx] > dis[x][y][z] + 1) {
        dis[xx][yx][zx] = dis[x][y][z] + 1;
        q.push(xx);
        q.push(yx);
        q.push(zx);
      }
    }
    xx = x, yx = y, zx = (z + 1) % 4;
    if (dis[xx][yx][zx] > dis[x][y][z] + 1) {
      dis[xx][yx][zx] = dis[x][y][z] + 1;
      q.push(xx);
      q.push(yx);
      q.push(zx);
    }
  }
  int ans = min(min(dis[x2][y2][0], dis[x2][y2][1]),
                min(dis[x2][y2][2], dis[x2][y2][3]));
  cout << (ans == 1e9 ? -1 : ans);
}
