#include <bits/stdc++.h>
using namespace std;
int a, b, c, n, m, T, x[100010];
struct node {
  int a, b;
  node(int t, int y) { a = t, b = y; }
};
queue<node> q;
void ad() {
  for (int i = 3; i <= n / 2; i++) {
    if (x[i]) continue;
    int temp = 0;
    for (int j = 3 * i; j <= n; j += i) {
      if (x[j]) continue;
      if (temp) {
        q.push(node(j, temp));
        x[temp] = 1;
        x[j] = 1;
        temp = 0;
      } else
        temp = j;
    }
    if (temp) {
      q.push(node(i, temp));
      x[temp] = x[i] = 1;
    } else if (x[2 * i] == 0) {
      q.push(node(i, 2 * i));
      x[i] = x[2 * i] = 1;
    }
  }
  int temp = 0;
  for (int i = 2; i <= n; i += 2) {
    if (x[i]) continue;
    if (temp) {
      q.push(node(i, temp));
      x[temp] = 1;
      x[i] = 1;
      temp = 0;
    } else
      temp = i;
  }
}
int main() {
  scanf("%d", &n);
  ad();
  cout << q.size() << endl;
  while (!q.empty()) {
    cout << q.front().a << ' ' << q.front().b << endl;
    q.pop();
  }
}
