import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Solution { enum moves { UL(new int[]{-2, -1}), UR(new int[]{-2, 1}), R(new int[]{0, 2}), LR(new int[]{2, 1}), LL(new int[]{2, -1}), L(new int[]{0, -2}); int[] delta; moves(int[] delta) { this.delta = delta; } } static void printShortestPath(int n, int i_start, int j_start, int i_end, int j_end) { // Print the distance along with the sequence of delta. List list = new ArrayList<>(); int next_i = i_start; int next_j = j_start; int remaining_distance = 2 * n; while (!(next_i == i_end && next_j == j_end)) { list.add(getOptimalMove(n, next_i, next_j, i_end, j_end)); next_i += list.get(list.size() - 1).delta[0]; next_j += list.get(list.size() - 1).delta[1]; int t = Math.abs(i_end - next_i) + Math.abs(j_end - next_j); if (t >= remaining_distance) { list.clear(); break; } else remaining_distance = t; } if (list.size() == 0) System.out.println("Impossible"); else { System.out.println(list.size()); list.forEach(e -> System.out.print(e + " ")); } } private static moves getOptimalMove(int n, int i_start, int j_start, int i_end, int j_end) { moves next = null; int i_next; int j_next; int min_distance = Integer.MAX_VALUE; for (int i = 0; i < moves.values().length; i++) { i_next = i_start + moves.values()[i].delta[0]; j_next = j_start + moves.values()[i].delta[1]; if (i_next < 0 || i_next >= n || j_next < 0 || j_next >= n) continue; int t = Math.abs(i_end - i_next) + Math.abs(j_end - j_next); if (t < min_distance) { min_distance = t; next = moves.values()[i]; } } return next; } public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int i_start = in.nextInt(); int j_start = in.nextInt(); int i_end = in.nextInt(); int j_end = in.nextInt(); printShortestPath(n, i_start, j_start, i_end, j_end); in.close(); } }