import java.util.Scanner; public class Main { static int cnt; public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { int n = in.nextInt(); if (n == 1) { System.out.println("Case " + ++cnt + ":\n"); continue; } init(n); calc(n); } } private static void init(int n) { used = new boolean[n]; N = new int[n]; } private static void calc(int n) { System.out.println("Case " + ++cnt + ":"); solve(0, n); System.out.println(); } static boolean[] used; static int[] N; private static void solve(int pos, int n) { if (pos == n) { if (valid(N.length - 1)) { print(); } return; } if (N[0] > 1) return; for (int i = 0; i < n; i++) { if (!used[i]) { N[pos] = i + 1; if (valid2(pos)) { used[i] = true; solve(pos + 1, n); used[i] = false; } } } } private static void print() { for (int i = 0; i < N.length; i++) { if (i == 0) { System.out.print(N[0]); continue; } System.out.print(" " + N[i]); } System.out.println(); } private static boolean valid(int len) { boolean flag = true; for (int i = 0; i < len; i++) { if (!isPrime(N[i] + N[i + 1])) { flag = false; break; } } return isPrime(N[N.length - 1] + N[0]) ? flag : false; } private static boolean valid2(int len) { boolean flag = true; for (int i = 0; i < len; i++) { if (!isPrime(N[i] + N[i + 1])) { flag = false; break; } } return flag; } private static boolean isPrime(int n) { boolean flag = true; for (int i = 2; i * i <= n; i++) { if (n % i == 0) { flag = false; break; } } return flag; } } /************************************************************** Problem: 2128 User: admin Language: Java Result: Accepted Time:1107 ms Memory:46600 kb ****************************************************************/