#include using namespace std; const int MAX = 40; const int INF = 1e9; int H, W; int Sx, Sy, Gx, Gy; char grid[MAX][MAX]; struct State { int x, y; int a, b, c, d; }; int dx[4] = {1, -1, 0, 0}; int dy[4] = {0, 0, 1, -1}; int main() { vectorsosu(20001,true); sosu[0] = false; sosu[1] = false; for(int i = 2;i<450;i++){ if(sosu[i] != true)continue; else{ long long j = 2; while(j*i < 20001){ sosu[j*i] = false; j++; } } } cin >> H >> W; cin >> Sx >> Sy; cin >> Gx >> Gy; Sx--; Sy--; Gx--; Gy--; for (int i = 0; i < H; ++i) { cin >> grid[i]; } queue q; set> visited; q.push({Sx, Sy, 0, 0, 0, 0}); visited.insert({Sx, Sy, 0, 0, 0, 0}); int ans = INF; while (!q.empty()) { State s = q.front(); q.pop(); if (s.x == Gx && s.y == Gy) { if (sosu[s.a] && sosu[s.b] && sosu[s.c] && sosu[s.d]) { ans = min(ans, s.a + s.b + s.c + s.d); } } for (int dir = 0; dir < 4; ++dir) { int nx = s.x + dx[dir]; int ny = s.y + dy[dir]; if (nx < 0 || nx >= H || ny < 0 || ny >= W) continue; if (grid[nx][ny] == '#') continue; int na = s.a + (dir == 0); int nb = s.b + (dir == 1); int nc = s.c + (dir == 2); int nd = s.d + (dir == 3); if (na > 150 || nb > 150 || nc > 150 || nd > 150) continue; auto state = make_tuple(nx, ny, na, nb, nc, nd); if (visited.count(state)) continue; visited.insert(state); q.push({nx, ny, na, nb, nc, nd}); } } cout << (ans == INF ? -1 : ans) << endl; return 0; }