#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e5 + 10;
vector<int> ve[MAX];
int vis[MAX], v[MAX], p[MAX];
void init() {
  memset(v, 0, sizeof(v));
  for (int i = 2; i * i < MAX; i++) {
    if (!v[i]) {
      for (int j = i * i; j < MAX; j += i) {
        v[j] = 1;
      }
    }
  }
  int cnt = 1;
  for (int i = 3; i <= 100000; i++) {
    if (!v[i]) p[cnt++] = i;
  }
}
int main() {
  int n;
  init();
  while (scanf("%d", &n) != EOF) {
    memset(vis, 0, sizeof(vis));
    int cnt = 0, sum = 0;
    for (int i = 1; p[i] <= n / 2; i++) {
      int num = 0;
      for (int j = p[i]; j <= n; j += p[i]) {
        if (!vis[j] && j / 2 != p[i]) {
          ve[p[i]].push_back(j);
          num++;
          vis[j] = 1;
        }
      }
      if (num & 1) {
        vis[p[i] * 2] = 1;
        ve[p[i]].push_back(p[i] * 2);
      }
      sum += ve[p[i]].size() / 2;
    }
    for (int i = 2; i <= n; i++) {
      if (!vis[i] && i % 2 == 0) ve[2].push_back(i);
    }
    sum += ve[2].size() / 2;
    printf("%d\n", sum);
    for (int i = 2; i <= n / 2; i++) {
      if (ve[i].size()) {
        for (int j = 0; j < ve[i].size() - 1; j += 2) {
          printf("%d %d\n", ve[i][j], ve[i][j + 1]);
        }
      }
    }
  }
}
