#include<bits/stdc++.h> usingnamespace std; #define ll long long constint INF = 0x3f3f3f3f; const ll inf = 0x3f3f3f3f3f3f3f3f; const ll mod = 1e9 + 7; constint N = 2e6 + 10; int T; int prime[N]; bool is_prime[N]; vector<int>vc[N], rs; intsieve(int n){ int p = 0; for (int i = 2; i <= n; i++)is_prime[i] = true, vc[i].clear(); is_prime[0] = is_prime[1] = false; for (int i = 2; i <= n; i++) { if (is_prime[i]) { prime[p++] = i; vc[i].push_back(i); for (int j = 2 * i; j <= n; j += i) { is_prime[j] = false; vc[i].push_back(j); } } } return p; } int vis[N]; typedef pair<int, int>pii; vector<pii>ans; intmain(){ scanf("%d", &T); while (T--) { int n; scanf("%d", &n); sieve(n); fill(vis, vis + n + 1, 0); ans.clear(); rs.clear(); int a, b; for (int i = n / 2; i >= 3; i--) { if ((int)vc[i].size() <= 1)continue; a = -1, b = -1; int cnt = 0; for (int u : vc[i]) { if (!vis[u])cnt++; } if (cnt & 1) { vis[2 * i] = 1; rs.push_back(2 * i); } for (int u : vc[i]) { if (vis[u])continue; vis[u] = 1; if (a == -1)a = u; elseif (b == -1)b = u; if (a != -1 && b != -1) { ans.push_back(pii(a, b)); a = b = -1; } } } for (int u : vc[2])if (!vis[u])rs.push_back(u); a = -1, b = -1; for (int u : rs) { if (a == -1)a = u; elseif (b == -1)b = u; if (a != -1 && b != -1) { ans.push_back(pii(a, b)); a = b = -1; } } printf("%d\n", (int)ans.size()); for (pii p : ans)printf("%d %d\n", p.first, p.second); } return0; }