#include <bits/stdc++.h>
using namespace std;
long long modpow(long long a, long long p, long long mod) {
  long long ret = 1;
  while (p) {
    if (p & 1) ret = (ret * a) % mod;
    a = (a * a) % mod;
    p /= 2;
  }
  return ret;
}
long long power(long long a, long long p) {
  long long ret = 1;
  while (p) {
    if (p & 1) ret = (ret * a);
    a = (a * a);
    p /= 2;
  }
  return ret;
}
int p[1000011] = {0};
vector<int> prms;
void sieve(int n) {
  int i, j;
  prms.push_back(2);
  ;
  for (i = 3; i < n; i++) {
    if ((i % 2 == 0) || p[i]) continue;
    prms.push_back(i);
    p[i] = 1;
    for (j = 2 * i; j < n; j += i) p[j] = 1;
  }
}
vector<pair<int, int> > app;
vector<int> e;
int d[100011] = {0};
int main() {
  int i, j, k, tmp;
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  int n;
  cin >> n;
  sieve(n / 2 + 1);
  int l = (int)(prms.size());
  j = 1;
  while (j < l) {
    e.clear();
    for (i = prms[j]; i <= n; i += prms[j])
      if (!d[i]) {
        e.push_back(i);
        d[i] = 1;
      }
    if ((int)(e.size()) % 2) {
      if ((int)(e.size()) >= 3) app.push_back(make_pair(e[2], e[0]));
      d[2 * prms[j]] = 0;
      for (i = 4; i < (int)(e.size()); i += 2)
        app.push_back(make_pair(e[i], e[i - 1]));
    } else
      for (i = 1; i < (int)(e.size()); i += 2)
        app.push_back(make_pair(e[i], e[i - 1]));
    j++;
  }
  e.clear();
  for (i = 2; i <= n; i += 2)
    if (!d[i]) {
      e.push_back(i);
      d[i] = 1;
    }
  for (i = 1; i < (int)(e.size()); i += 2)
    app.push_back(make_pair(e[i], e[i - 1]));
  int s = (int)(app.size());
  cout << s << endl;
  for (i = 0; i < s; i++) cout << app[i].first << " " << app[i].second << endl;
  return 0;
}
