#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T bigmod(T p, T e, T M) {
  long long int ret = 1;
  for (; e > 0; e >>= 1) {
    if (e & 1) ret = (ret * p) % M;
    p = (p * p) % M;
  }
  return (T)ret;
}
template <class T>
inline T gcd(T a, T b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
template <class T>
inline T modinverse(T a, T M) {
  return bigmod(a, M - 2, M);
}
template <class T>
inline T bpow(T p, T e) {
  long long int ret = 1;
  for (; e > 0; e >>= 1) {
    if (e & 1) ret = (ret * p);
    p = (p * p);
  }
  return (T)ret;
}
int toInt(string s) {
  int sm;
  stringstream ss(s);
  ss >> sm;
  return sm;
}
int toLlint(string s) {
  long long int sm;
  stringstream ss(s);
  ss >> sm;
  return sm;
}
int ts, kk = 1;
int dy[] = {1, 0, -1, 0};
int dx[] = {0, -1, 0, 1};
bool gr[4][4][1001][1001];
int n, m;
char ls[] = {'+', '-', '|', '^', '>', '<', 'v', 'L', 'R', 'U', 'D', '*'};
int qs[12][4] = {1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0,
                 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1,
                 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0};
bool vs[4][1001][1001];
int main() {
  int t, i, j, k, l;
  scanf("%d%d", &n, &m);
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      char ch;
      scanf(" %c", &ch);
      for (k = 0; k < 12; k++)
        if (ls[k] == ch) break;
      for (t = 0; t < 4; t++) {
        for (l = 0; l < 4; l++) gr[t][l][i][j] = qs[k][(t + l) % 4];
      }
    }
  }
  int u, v, x, y;
  scanf("%d%d%d%d", &u, &v, &x, &y);
  if (u == x && v == y) {
    printf("0\n");
    return 0;
  }
  u--, v--, x--, y--;
  queue<int> qu;
  qu.push(0);
  qu.push(0);
  qu.push(u);
  qu.push(v);
  vs[0][u][v] = 1;
  while (!qu.empty()) {
    int d = qu.front();
    qu.pop();
    t = qu.front();
    qu.pop();
    u = qu.front();
    qu.pop();
    v = qu.front();
    qu.pop();
    if (u == x && v == y) {
      printf("%d\n", t);
      return 0;
    }
    if (vs[(d + 1) % 4][u][v] == 0) {
      vs[(d + 1) % 4][u][v] = 1;
      qu.push((d + 1) % 4);
      qu.push(t + 1);
      qu.push(u);
      qu.push(v);
    }
    for (i = 0; i < 4; i++) {
      if (gr[d][i][u][v] == 0) continue;
      int nu = u + dx[i];
      int nv = v + dy[i];
      if (nu < 0 || nv < 0 || nu >= n || nv >= m ||
          gr[d][(i + 2) % 4][nu][nv] == 0 || vs[d][nu][nv] == 1)
        continue;
      vs[d][nu][nv] = 1;
      qu.push(d);
      qu.push(t + 1);
      qu.push(nu);
      qu.push(nv);
    }
  }
  printf("-1\n");
  return 0;
}
