#include <bits/stdc++.h>
using namespace std;
const int MAX_N = (1 << 18);
int n;
int era[MAX_N];
int prime[MAX_N], pos;
int used[MAX_N];
int ans[MAX_N][2], apos;
void sieve() {
  long long i, j;
  for (i = 2; i <= 1e5; i++) {
    if (!era[i]) prime[pos++] = i;
    for (j = i * i; j <= 1e5; j += i) era[j] = 1;
  }
}
void do_it(int i) {
  int j, cnt = 0;
  for (j = 1; j * prime[i] <= n; j++) {
    if (used[j * prime[i]]) continue;
    cnt++;
  }
  if (cnt % 2) {
    ans[apos][0] = prime[i];
    used[prime[i]] = 1;
    j = 3;
  } else
    j = 1;
  for (; j * prime[i] <= n; j++) {
    if (used[j * prime[i]]) continue;
    if (ans[apos][0]) {
      ans[apos][1] = j * prime[i];
      used[j * prime[i]] = 1;
      apos++;
    } else {
      ans[apos][0] = j * prime[i];
      used[j * prime[i]] = 1;
    }
  }
}
int main() {
  int i;
  sieve();
  scanf("%d", &n);
  for (i = 1; prime[i] <= (n >> 1); i++) do_it(i);
  do_it(0);
  printf("%d\n", apos);
  for (i = 0; i < apos; i++) printf("%d %d\n", ans[i][0], ans[i][1]);
  return 0;
}
