#include <bits/stdc++.h>
using namespace std;
const int nm = 100002;
int n;
int match[nm];
bool nt[nm];
vector<int> tmp;
int main() {
  scanf("%d", &n);
  memset(nt, 1, sizeof(nt));
  int i, j;
  nt[0] = nt[1] = 0;
  for (i = 4; i <= n; i += 2) nt[i] = 0;
  for (i = 3; i * i <= n; i += 2) {
    if (nt[i]) {
      for (j = i * i; j <= n; j += 2 * i) nt[j] = 0;
      tmp.clear();
      for (j = i; j <= n; j += i)
        if (!match[j]) tmp.push_back(j);
      if (tmp.size() % 2) tmp.erase(tmp.begin() + 1);
      for (j = 0; j < int(tmp.size()); j += 2) {
        match[tmp[j]] = tmp[j + 1];
        match[tmp[j + 1]] = tmp[j];
      }
    }
  }
  for (; i <= n / 2; i += 2) {
    if (nt[i]) {
      tmp.clear();
      for (j = i; j <= n; j += i)
        if (!match[j]) tmp.push_back(j);
      if (tmp.size() % 2) tmp.erase(tmp.begin() + 1);
      for (j = 0; j < int(tmp.size()); j += 2) {
        match[tmp[j]] = tmp[j + 1];
        match[tmp[j + 1]] = tmp[j];
      }
    }
  }
  tmp.clear();
  for (i = 2; i <= n; i += 2)
    if (!match[i]) tmp.push_back(i);
  for (i = 0; i + 1 < int(tmp.size()); i += 2) {
    match[tmp[i]] = tmp[i + 1];
    match[tmp[i + 1]] = tmp[i];
  }
  j = 0;
  for (i = 1; i <= n; ++i)
    if (match[i]) j++;
  printf("%d\n", j / 2);
  for (i = 1; i <= n; ++i)
    if (match[i] > i) printf("%d %d\n", i, match[i]);
}
