#include <bits/stdc++.h>   using namespace std;   const int NMAX = 1005;   const int INF = 1 << 30;   int n, m, xs, xf, ys, yf;   char a[4][NMAX][NMAX];   int d[4][NMAX][NMAX];   bool inq[4][NMAX][NMAX];   deque<pair<int, pair<int, int>>> q;   bool u(int dir, int x, int y) {     char c = a[dir][x][y];     return c ==  +  || c ==  |  || c ==  ^  || c ==  L  || c ==  R  || c ==  D ;   }   bool r(int dir, int x, int y) {     char c = a[dir][x][y];     return c ==  +  || c ==  -  || c ==  >  || c ==  L  || c ==  U  || c ==  D ;   }   bool dd(int dir, int x, int y) {     char c = a[dir][x][y];     return c ==  +  || c ==  |  || c ==  v  || c ==  L  || c ==  R  || c ==  U ;   }   bool l(int dir, int x, int y) {     char c = a[dir][x][y];     return c ==  +  || c ==  -  || c ==  <  || c ==  U  || c ==  R  || c ==  D ;   }   void update(int dir, int x, int y, int newdir, int newx, int newy) {     if (newx < 1 || newx > n || newy < 1 || newy > m) return;     if (d[dir][x][y] + 1 < d[newdir][newx][newy]) {       d[newdir][newx][newy] = d[dir][x][y] + 1;       if (!inq[newdir][newx][newy]) {         inq[newdir][newx][newy] = 1;         q.push_back({newdir, {newx, newy}});       }     }   }   int main() {     cin.sync_with_stdio(false);     cin >> n >> m;     for (int i = 1; i <= n; i++) cin >> (a[0][i] + 1);     for (int i = 1; i <= n; i++)       for (int j = 1; j <= m; j++) {         if (a[0][i][j] ==  + ) {           for (int k = 1; k < 4; k++) {             a[k][i][j] =  + ;           }         } else if (a[0][i][j] ==  - ) {           a[1][i][j] =  | ;           a[2][i][j] =  - ;           a[3][i][j] =  | ;         } else if (a[0][i][j] ==  | ) {           a[1][i][j] =  - ;           a[2][i][j] =  | ;           a[3][i][j] =  - ;         } else if (a[0][i][j] ==  ^ ) {           a[1][i][j] =  > ;           a[2][i][j] =  v ;           a[3][i][j] =  < ;         } else if (a[0][i][j] ==  > ) {           a[1][i][j] =  v ;           a[2][i][j] =  < ;           a[3][i][j] =  ^ ;         } else if (a[0][i][j] ==  v ) {           a[1][i][j] =  < ;           a[2][i][j] =  ^ ;           a[3][i][j] =  > ;         } else if (a[0][i][j] ==  < ) {           a[1][i][j] =  ^ ;           a[2][i][j] =  > ;           a[3][i][j] =  v ;         } else if (a[0][i][j] ==  L ) {           a[1][i][j] =  U ;           a[2][i][j] =  R ;           a[3][i][j] =  D ;         } else if (a[0][i][j] ==  U ) {           a[1][i][j] =  R ;           a[2][i][j] =  D ;           a[3][i][j] =  L ;         } else if (a[0][i][j] ==  R ) {           a[1][i][j] =  D ;           a[2][i][j] =  L ;           a[3][i][j] =  U ;         } else if (a[0][i][j] ==  D ) {           a[1][i][j] =  L ;           a[2][i][j] =  U ;           a[3][i][j] =  R ;         } else {           for (int k = 1; k < 4; k++) {             a[k][i][j] =  * ;           }         }       }     cin >> xs >> ys >> xf >> yf;     q.push_back({0, {xs, ys}});     inq[0][xs][ys] = 1;     for (int k = 0; k < 4; k++)       for (int i = 1; i <= n; i++)         for (int j = 1; j <= m; j++) d[k][i][j] = INF;     d[0][xs][ys] = 0;     while (!q.empty()) {       int dir = q.front().first;       int x = q.front().second.first;       int y = q.front().second.second;       q.pop_front();       inq[dir][x][y] = 0;       update(dir, x, y, (dir + 1) % 4, x, y);       if (a[dir][x][y] ==  + ) {         if (dd(dir, x - 1, y)) update(dir, x, y, dir, x - 1, y);         if (l(dir, x, y + 1)) update(dir, x, y, dir, x, y + 1);         if (u(dir, x + 1, y)) update(dir, x, y, dir, x + 1, y);         if (r(dir, x, y - 1)) update(dir, x, y, dir, x, y - 1);       } else if (a[dir][x][y] ==  - ) {         if (r(dir, x, y - 1)) update(dir, x, y, dir, x, y - 1);         if (l(dir, x, y + 1)) update(dir, x, y, dir, x, y + 1);       } else if (a[dir][x][y] ==  | ) {         if (dd(dir, x - 1, y)) update(dir, x, y, dir, x - 1, y);         if (u(dir, x + 1, y)) update(dir, x, y, dir, x + 1, y);       } else if (a[dir][x][y] ==  ^ ) {         if (dd(dir, x - 1, y)) update(dir, x, y, dir, x - 1, y);       } else if (a[dir][x][y] ==  > ) {         if (l(dir, x, y + 1)) update(dir, x, y, dir, x, y + 1);       } else if (a[dir][x][y] ==  v ) {         if (u(dir, x + 1, y)) update(dir, x, y, dir, x + 1, y);       } else if (a[dir][x][y] ==  < ) {         if (r(dir, x, y - 1)) update(dir, x, y, dir, x, y - 1);       } else if (a[dir][x][y] ==  L ) {         if (dd(dir, x - 1, y)) update(dir, x, y, dir, x - 1, y);         if (l(dir, x, y + 1)) update(dir, x, y, dir, x, y + 1);         if (u(dir, x + 1, y)) update(dir, x, y, dir, x + 1, y);       } else if (a[dir][x][y] ==  U ) {         if (l(dir, x, y + 1)) update(dir, x, y, dir, x, y + 1);         if (u(dir, x + 1, y)) update(dir, x, y, dir, x + 1, y);         if (r(dir, x, y - 1)) update(dir, x, y, dir, x, y - 1);       } else if (a[dir][x][y] ==  R ) {         if (dd(dir, x - 1, y)) update(dir, x, y, dir, x - 1, y);         if (u(dir, x + 1, y)) update(dir, x, y, dir, x + 1, y);         if (r(dir, x, y - 1)) update(dir, x, y, dir, x, y - 1);       } else if (a[dir][x][y] ==  D ) {         if (dd(dir, x - 1, y)) update(dir, x, y, dir, x - 1, y);         if (l(dir, x, y + 1)) update(dir, x, y, dir, x, y + 1);         if (r(dir, x, y - 1)) update(dir, x, y, dir, x, y - 1);       }     }     int sol = INF;     for (int i = 0; i < 4; i++) sol = min(sol, d[i][xf][yf]);     if (sol == INF) sol = -1;     cout << sol;     return 0;   }