#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:256000000")
template <class T>
T sqr(T a) {
  return a * a;
}
int n, m;
int het[100001], r = 0;
int a[100000];
int pr[100000];
vector<pair<int, int> > ot;
void init() {
  cin >> n;
  for (int i = 2; i <= sqrt((double)n); ++i) {
    if (pr[i]) continue;
    for (int j = i * i; j < n; j += i) pr[j] = 1;
  }
}
void solve() {
  for (int i = n / 2; i >= 2; --i) {
    if (pr[i]) continue;
    int k = 0;
    vector<int> t;
    for (int j = i; j <= n; j += i) {
      if (a[j]) continue;
      k++;
      t.push_back(j);
    }
    if (k == 1) continue;
    if (k & 1) {
      a[t[0]] = 1, a[t[2]] = 1;
      ot.push_back(pair<int, int>(t[0], t[2]));
      for (int j = 3; j < k; j += 2) {
        a[t[j]] = 1, a[t[j + 1]] = 1;
        ot.push_back(pair<int, int>(t[j], t[j + 1]));
      }
    } else {
      for (int j = 0; j < k; j += 2) {
        a[t[j]] = 1, a[t[j + 1]] = 1;
        ot.push_back(pair<int, int>(t[j], t[j + 1]));
      }
    }
  }
  printf("%d\n", ot.size());
  for (int i = 0; i < ot.size(); i++)
    printf("%d %d\n", ot[i].first, ot[i].second);
}
int main() {
  init();
  solve();
  return 0;
}
