#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 2, M = 4e6 + 1, INF = 1e9 + 1;
int n, m, t[N][N], k, u, v, xi, yi, xf, yf, vis[M], d[M], r;
char h[N][N], c, cu, cl, cr, cd;
vector<int> g[M];
set<char> up, down, asndodasndsa, asndodasndsa2;
queue<int> q;
char rotate(char c) {
  if (c == '|') return '-';
  if (c == '-') return '|';
  if (c == '^') return '>';
  if (c == '>') return 'v';
  if (c == 'v') return '<';
  if (c == '<') return '^';
  if (c == 'L') return 'U';
  if (c == 'U') return 'R';
  if (c == 'R') return 'D';
  if (c == 'D') return 'L';
  return c;
}
int main() {
  up.insert('+'), up.insert('|'), up.insert('^'), up.insert('L'),
      up.insert('R'), up.insert('D');
  down.insert('+'), down.insert('|'), down.insert('v'), down.insert('L'),
      down.insert('R'), down.insert('U');
  asndodasndsa.insert('+'), asndodasndsa.insert('-'), asndodasndsa.insert('<'),
      asndodasndsa.insert('D'), asndodasndsa.insert('R'),
      asndodasndsa.insert('U');
  asndodasndsa2.insert('+'), asndodasndsa2.insert('-'),
      asndodasndsa2.insert('>'), asndodasndsa2.insert('D'),
      asndodasndsa2.insert('L'), asndodasndsa2.insert('U');
  for (int i = 0; i < M; ++i) d[i] = INF;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j) t[i][j] = ++k, scanf(" %c", &h[i][j]);
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j) {
      u = t[i][j];
      c = h[i][j], cu = h[i - 1][j], cd = h[i + 1][j], cl = h[i][j - 1],
      cr = h[i][j + 1];
      for (int l = 0; l < 4; ++l) {
        g[l * k + u].push_back((l + 1) % 4 * k + u);
        if (down.count(c) and up.count(cd))
          g[l * k + u].push_back(l * k + t[i + 1][j]);
        if (up.count(c) and down.count(cu))
          g[l * k + u].push_back(l * k + t[i - 1][j]);
        if (asndodasndsa.count(c) and asndodasndsa2.count(cl))
          g[l * k + u].push_back(l * k + t[i][j - 1]);
        if (asndodasndsa2.count(c) and asndodasndsa.count(cr))
          g[l * k + u].push_back(l * k + t[i][j + 1]);
        c = rotate(c), cr = rotate(cr), cl = rotate(cl), cd = rotate(cd),
        cu = rotate(cu);
      }
    }
  scanf("%d%d%d%d", &xi, &yi, &xf, &yf);
  u = t[xi][yi];
  q.push(u);
  vis[u] = 1;
  d[u] = 0;
  while (!q.empty()) {
    u = q.front();
    q.pop();
    for (int i = 0; i < g[u].size(); ++i) {
      v = g[u][i];
      if (vis[v]) continue;
      vis[v] = 1;
      q.push(v);
      d[v] = d[u] + 1;
    }
  }
  r = INF;
  for (int i = 0; i < 4; ++i) r = min(r, d[i * k + t[xf][yf]]);
  printf("%d\n", r < INF ? r : -1);
  return 0;
}
