#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > ans;
const int M = 1e6;
bool isPrime[M + 5];
int factor[M + 5];
void getPrime() {
  for (int i = 0; i <= M; i++) isPrime[i] = 1;
  isPrime[0] = isPrime[1] = 0;
  for (int i = 2; i * i <= M; i++) {
    if (isPrime[i]) {
      for (int j = i * i; j <= M; j += i) {
        isPrime[j] = 0;
        if (factor[j] == 0) factor[j] = i;
      }
    }
  }
  for (int i = 2; i <= M; i++)
    if (factor[i] == 0) factor[i] = i;
}
bool mark[100005];
int main() {
  getPrime();
  int n;
  scanf("%d", &n);
  for (int i = 3; i <= n / 2; i++) {
    if (!isPrime[i]) continue;
    vector<int> v;
    for (int j = i; j <= n; j += i) {
      if (mark[j]) continue;
      v.push_back(j);
    }
    if (v.size() % 2 == 0) {
      for (int j = 0; j < v.size(); j += 2) {
        ans.push_back(pair<int, int>(v[j], v[j + 1]));
        mark[v[j]] = 1;
        mark[v[j + 1]] = 1;
      }
    } else {
      ans.push_back(pair<int, int>(v[0], v[2]));
      mark[v[0]] = 1;
      mark[v[2]] = 1;
      for (int j = 3; j < v.size(); j += 2) {
        ans.push_back(pair<int, int>(v[j], v[j + 1]));
        mark[v[j]] = 1;
        mark[v[j + 1]] = 1;
      }
    }
  }
  vector<int> v;
  for (int j = 2; j <= n; j += 2) {
    if (mark[j]) continue;
    v.push_back(j);
  }
  if (v.size() > 1) {
    for (int j = 0; j < v.size() - 1; j += 2) {
      ans.push_back(pair<int, int>(v[j], v[j + 1]));
      mark[v[j]] = 1;
      mark[v[j + 1]] = 1;
    }
  }
  printf("%d\n", ans.size());
  for (int i = 0; i < ans.size(); i++)
    printf("%d %d\n", ans[i].first, ans[i].second);
}
