#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
bool check[MAXN];
int prime[MAXN], tot = 0, n;
int tmp[MAXN], tmpcnt = 0;
int ans[MAXN][2], anscnt = 0;
inline void MakePrime() {
  memset(check, 0, sizeof(check));
  check[1] = true;
  for (int i = 2; i <= n; i++) {
    if (!check[i]) prime[++tot] = i;
    for (int j = 1; j <= tot && prime[j] * i <= n; j++) {
      check[prime[j] * i] = true;
      if (i % prime[j] == 0) break;
    }
  }
}
int main() {
  scanf("%d", &n);
  MakePrime();
  memset(check, 0, sizeof(check));
  for (int i = 2; i <= tot; i++)
    if (prime[i] * 2 <= n) {
      tmp[tmpcnt = 1] = prime[i];
      for (int j = 3; prime[i] * j <= n; j++)
        if (!check[prime[i] * j]) tmp[++tmpcnt] = prime[i] * j;
      if (tmpcnt & 1) tmp[++tmpcnt] = prime[i] * 2;
      for (int j = 1; j < tmpcnt; j += 2)
        check[tmp[j]] = check[tmp[j + 1]] = true, ans[++anscnt][0] = tmp[j],
        ans[anscnt][1] = tmp[j + 1];
    }
  int last = 0;
  for (int i = 2; i <= n; i += 2)
    if (!check[i]) {
      if (!last)
        last = i;
      else
        ans[++anscnt][0] = last, ans[anscnt][1] = i, last = 0;
    }
  printf("%d\n", anscnt);
  for (int i = 1; i <= anscnt; i++) printf("%d %d\n", ans[i][0], ans[i][1]);
}
