#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 7;
int n, m, ans;
char mat[4][maxn][maxn];
int vis[maxn][maxn][4];
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
int x, y, x2, y2;
struct node {
  int x, y, s, t;
};
node st;
char change(char x) {
  if (x == '+') return '+';
  if (x == '-') return '|';
  if (x == '|') return '-';
  if (x == '^') return '>';
  if (x == '>') return 'v';
  if (x == 'v') return '<';
  if (x == '<') return '^';
  if (x == 'L') return 'U';
  if (x == 'R') return 'D';
  if (x == 'U') return 'R';
  if (x == 'D') return 'L';
  if (x == '*') return '*';
}
bool ok_R(char x) {
  if (x == '+' || x == '-' || x == '>' || x == 'L' || x == 'U' || x == 'D')
    return true;
  return false;
}
bool ok_L(char x) {
  if (x == '+' || x == '-' || x == '<' || x == 'R' || x == 'U' || x == 'D')
    return true;
  return false;
}
bool ok_U(char x) {
  if (x == '+' || x == '|' || x == '^' || x == 'L' || x == 'R' || x == 'D')
    return true;
  return false;
}
bool ok_D(char x) {
  if (x == '+' || x == '|' || x == 'v' || x == 'L' || x == 'U' || x == 'R')
    return true;
  return false;
}
bool check(node x, node y, int k) {
  int t = x.s;
  char a = mat[t][x.x][x.y], b = mat[t][y.x][y.y];
  if (k == 2) {
    if (ok_R(a) && ok_L(b)) return true;
    return false;
  }
  if (k == 3) {
    if (ok_R(b) && ok_L(a)) return true;
    return false;
  }
  if (k == 0) {
    if (ok_D(a) && ok_U(b)) return true;
    return false;
  }
  if (k == 1) {
    if (ok_U(a) && ok_D(b)) return true;
    return false;
  }
}
void bfs() {
  queue<node> q;
  q.push(st);
  vis[x][y][0] = 1;
  while (!q.empty()) {
    node cur = q.front();
    q.pop();
    if (cur.x == x2 && cur.y == y2) {
      ans = cur.t;
      break;
    }
    if (!vis[cur.x][cur.y][(cur.s + 1) % 4]) {
      node next = cur;
      next.s = (cur.s + 1) % 4, next.t += 1;
      q.push(next);
      vis[next.x][next.y][next.s] = 1;
    }
    for (int i = 0; i < 4; i++) {
      node next = cur;
      next.x += dx[i];
      next.y += dy[i];
      next.t += 1;
      if (next.x < 0 || next.x >= n) continue;
      if (next.y < 0 || next.y >= m) continue;
      if (vis[next.x][next.y][next.s]) continue;
      if (!check(cur, next, i)) continue;
      q.push(next);
      vis[next.x][next.y][next.s] = 1;
    }
  }
  return;
}
int main() {
  ans = -1;
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) scanf("%s", mat[0][i]);
  for (int l = 1; l < 4; l++)
    for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++) mat[l][i][j] = change(mat[l - 1][i][j]);
  scanf("%d%d%d%d", &x, &y, &x2, &y2);
  x--, y--, x2--, y2--;
  st.x = x, st.y = y, st.s = 0, st.t = 0;
  bfs();
  printf("%d\n", ans);
  return 0;
}
