#include <bits/stdc++.h>
const int N = 100005;
int vis[N], prime[N], cnt, tot, b[N], st[N], tp, n, use[N];
void sieve(int n) {
  for (int i = 2; i <= n; i++) {
    if (!vis[i]) prime[++cnt] = i;
    for (int j = 1; j <= cnt && i * prime[j] <= n; j++) {
      vis[i * prime[j]] = i;
      if (i % prime[j] == 0) break;
    }
  }
}
struct note {
  int x, y;
} a[N];
int main() {
  scanf("%d", &n);
  sieve(n);
  memset(use, 0, sizeof(use));
  for (int i = n / 2; i >= 2; i--) {
    if (vis[i]) continue;
    tp = 0;
    for (int j = i; j <= n; j += i)
      if (!use[j]) st[++tp] = j, use[j] = 1;
    if (!tp) continue;
    if (tp & 1)
      use[st[2]] = 0, a[++tot] = (note){st[1], st[3]};
    else
      a[++tot] = (note){st[1], st[2]};
    for (int j = tp; j >= 4; j -= 2) a[++tot] = (note){st[j], st[j - 1]};
  }
  printf("%d\n", tot);
  for (int i = 1; i <= tot; i++) printf("%d %d\n", a[i].x, a[i].y);
}
