#include <bits/stdc++.h>
using namespace std;
const long long int md = 1e9 + 7;
const long long int N = 100005;
bool prime[N], done[N];
vector<long long int> p_f[N];
set<long long int> d[N];
pair<long long int, long long int> a[N];
long long int sz, sz1, temp[N];
signed main() {
  long long int n;
  scanf("%lld", &n);
  for (long long int p = 2; p <= n; p++) {
    if (!prime[p]) {
      for (long long int j = p; j <= n; j += p) {
        p_f[j].emplace_back(p);
        d[p].insert(j);
        prime[j] = 1;
      }
      prime[p] = 0;
    }
  }
  for (long long int p = 3; p <= n / 2; p++) {
    if (!prime[p]) {
      if (d[p].size() & 1) {
        d[p].erase(2 * p);
      }
      long long int last = -1;
      sz1 = 0;
      for (long long int x : d[p]) {
        if (last == -1)
          last = x;
        else {
          a[++sz] = {last, x};
          last = -1;
        }
        temp[++sz1] = x;
        done[x] = 1;
      }
      for (long long int i = 1; i <= sz1; i++) {
        for (long long int p : p_f[temp[i]]) {
          d[p].erase(temp[i]);
        }
      }
    }
  }
  long long int last = -1;
  for (long long int i = 2; i <= n; i += 2) {
    if (done[i]) continue;
    if (last == -1)
      last = i;
    else {
      a[++sz] = {last, i};
      last = -1;
    }
  }
  printf("%lld\n", sz);
  for (long long int i = 1; i <= sz; i++)
    printf("%lld %lld\n", a[i].first, a[i].second);
  return 0;
}
