#include #include using namespace std; int main() { // 入力の高速化 ios::sync_with_stdio(false); cin.tie(nullptr); int N; if (!(cin >> N)) return 0; // N=1, 2 の場合は構成不可能 if (N <= 2) { cout << -1 << endl; return 0; } int num_vertices = N * N; vector> edges; // 辺の構築 // 循環グラフ C_{N^2}(1, N) を構築する // 辺の種類1: i と (i+1) を結ぶ (グリッドの横方向+螺旋) // 辺の種類2: i と (i+N) を結ぶ (グリッドの縦方向) for (int i = 0; i < num_vertices; ++i) { // 頂点番号は 1-indexed で出力するため +1 して調整 // Type 1: i <-> i+1 // i と (i+1)%Mod を結ぶ辺を追加 // 全ての i についてこれを行うと、0-1, 1-2, ..., (M-1)-0 というサイクルができる // 各辺は1回ずつ生成されるので重複はない int u = i + 1; int v1 = (i + 1) % num_vertices + 1; edges.push_back({u, v1}); // Type 2: i <-> i+N int v2 = (i + N) % num_vertices + 1; edges.push_back({u, v2}); } // 出力 cout << edges.size() << endl; for (const auto& e : edges) { cout << e.first << " " << e.second << "\n"; } return 0; }