#include #include #include #include #include using namespace std; const int MAX_SUM = 60000; bool is_sq_arr[MAX_SUM + 5]; inline bool is_sq(int n) { if (n < 0 || n > MAX_SUM) return false; return is_sq_arr[n]; } int N; int W[105]; inline int D(int a, int b) { return abs((a - 1) * (a - 1) - (b - 1) * (b - 1)); } vector get_tree_path(int a, int b) { vector path; if (a < b) { for (int k = a; k < b; ++k) path.push_back(k); } else { for (int k = a - 1; k >= b; --k) path.push_back(k); } return path; } inline int get_shortcut_id(int x) { if (x == 2) return 1; return N + x - 3; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); for (int i = 0; i * i <= MAX_SUM; ++i) { is_sq_arr[i * i] = true; } if (!(cin >> N)) return 0; if (N == 2) { cout << 1 << "\n"; cout << 1 << " " << 2 << " " << 1 << "\n"; cout << 1 << " " << 1 << "\n"; return 0; } vector evens; for (int i = 2; i <= 200; i += 2) { evens.push_back(i); } mt19937 rng(1337); vector> ans_paths(N * N + 5); while (true) { shuffle(evens.begin(), evens.end(), rng); for (int i = 3; i <= N; ++i) { W[i] = evens[i - 3]; } W[2] = 1; bool all_ok = true; for (int u = 1; u <= N && all_ok; ++u) { for (int v = u + 1; v <= N && all_ok; ++v) { if (u == 1) { ans_paths[u * N + v] = get_tree_path(1, v); continue; } if (is_sq(D(u, v))) { ans_paths[u * N + v] = get_tree_path(u, v); continue; } bool found = false; for (int x = 2; x <= N && !found; ++x) { int d_ux_Wx = D(u, x) + W[x]; int min_ux = min(u, x); int max_ux = max(u, x); for (int y = 2; y <= N && !found; ++y) { int min_vy = min(v, y); int max_vy = max(v, y); if (max_ux < min_vy || max_vy < min_ux) { if (is_sq(d_ux_Wx + W[y] + D(y, v))) { vector p; vector p1 = get_tree_path(u, x); p.insert(p.end(), p1.begin(), p1.end()); p.push_back(get_shortcut_id(x)); p.push_back(get_shortcut_id(y)); vector p2 = get_tree_path(y, v); p.insert(p.end(), p2.begin(), p2.end()); ans_paths[u * N + v] = move(p); found = true; } } } } if (!found) { all_ok = false; } } } if (all_ok) break; } int M = 2 * N - 3; cout << M << "\n"; for (int i = 1; i < N; ++i) { cout << i << " " << i + 1 << " " << 2 * i - 1 << "\n"; } for (int i = 3; i <= N; ++i) { cout << 1 << " " << i << " " << W[i] << "\n"; } for (int u = 1; u <= N; ++u) { for (int v = u + 1; v <= N; ++v) { const vector& p = ans_paths[u * N + v]; cout << p.size(); for (int e : p) { cout << " " << e; } cout << "\n"; } } return 0; }