#include using namespace std; struct Move { int dx, dy; string m; Move(int _x = 0, int _y = 0, const string& _m = "") : dx(_x), dy(_y), m(_m) {} }; struct point { int x, y; point(int _x=0, int _y=0):x(_x), y(_y) {} bool operator<(const point& p) const { return (this->x==p.x?this->yx Q; map ck; Q.push(point(i_start, j_start)); ck[point(i_start, j_start)] = Move(0, 0, ""); while (!Q.empty() && !found) { point p = Q.front(); Q.pop(); for (int i=0;i<6;++i) { point pp = point(p.x+moves[i].dx, p.y+moves[i].dy); if (pp.x < 0 || pp.y < 0 || pp.x >= n || pp.y >= n) continue; if (ck.count(pp) != 0) continue; ck[pp] = moves[i]; Q.push(pp); if (pp.x == i_end && pp.y == j_end) found = true; } } if (found) { point p = point(i_end, j_end); vector ans ; while (p.x != i_start || p.y != j_start) { Move m = ck[p]; p = point(p.x - m.dx, p.y - m.dy); ans.push_back(m.m); } cout << ans.size() << endl; for (int i=ans.size()-1;i>=0;--i) cout << ans[i] << (i==0?'\n':' '); } else { cout << "Impossible" << endl; } } int main() { int n; cin >> n; int i_start; int j_start; int i_end; int j_end; cin >> i_start >> j_start >> i_end >> j_end; printShortestPath(n, i_start, j_start, i_end, j_end); return 0; }