#include <bits/stdc++.h>
using namespace std;
int a[100009];
bool mar[100009], prim[100009];
vector<int> temp, temp2;
vector<pair<int, int> > final;
void sieve() {
  int i, j, t1, t2, t3, t4;
  for (i = 2; i <= 100000; i++) {
    if (a[i] == 0) {
      prim[i] = 1;
      for (j = 2 * i; j <= 100000; j += i) {
        a[j] = 1;
      }
    }
  }
  return;
}
int main() {
  int i, j, t1, t2, t3, t4, n, ans;
  scanf("%d", &n);
  sieve();
  for (i = 3; i <= n / 2; i++) {
    if (prim[i]) {
      temp.clear();
      for (j = i; j <= n; j += i) {
        if (!mar[j]) {
          temp.push_back(j);
        }
      }
      t1 = (int)temp.size();
      if (t1 % 2 == 0) {
        for (j = 0; j < t1; j += 2) {
          final.push_back(make_pair(temp[j], temp[j + 1]));
          mar[temp[j]] = 1;
          mar[temp[j + 1]] = 1;
        }
      } else {
        temp2.clear();
        for (j = 0; j < t1; j++) {
          if (j == 1) {
            continue;
          }
          temp2.push_back(temp[j]);
        }
        t1--;
        for (j = 0; j < t1; j += 2) {
          final.push_back(make_pair(temp2[j], temp2[j + 1]));
          mar[temp2[j]] = 1;
          mar[temp2[j + 1]] = 1;
        }
      }
    }
  }
  temp.clear();
  for (i = 2; i <= n; i += 2) {
    if (!mar[i]) {
      temp.push_back(i);
    }
  }
  t1 = (int)temp.size();
  if (t1 % 2) {
    temp.pop_back();
    t1--;
  }
  for (i = 0; i < t1; i += 2) {
    final.push_back(make_pair(temp[i], temp[i + 1]));
  }
  ans = (int) final.size();
  printf("%d\n", ans);
  for (auto it : final) {
    printf("%d %d\n", it.first, it.second);
  }
  return 0;
}
