#include <bits/stdc++.h>
using namespace std;
int main() {
  int n;
  cin >> n;
  vector<int> sieve(n / 2 + 1, 1);
  for (int i = 2; i <= n / 2; ++i)
    if (sieve[i]) {
      int mul = 2;
      while (mul * i <= n / 2) sieve[mul * i] = 0, ++mul;
    }
  vector<int> primes;
  for (int i = 2; i <= n / 2; ++i)
    if (sieve[i]) primes.push_back(i);
  vector<pair<int, int> > res;
  set<int> used;
  vector<int> skipped;
  for (int i = 1; i < primes.size(); ++i) {
    int mul = 1;
    vector<int> good;
    while (primes[i] * mul <= n) {
      if (used.count(mul * primes[i]))
        ;
      else
        good.push_back(mul * primes[i]), used.insert(mul * primes[i]);
      ++mul;
    }
    int start = 0;
    if (good.size() % 2) {
      start = 3;
      if (good.size() > 1) {
        res.push_back({good[0], good[2]});
        skipped.push_back(good[1]);
      }
    }
    for (; start < good.size(); start += 2)
      res.push_back({good[start], good[start + 1]});
  }
  int mul = 1;
  vector<int> good;
  while (2 * mul <= n) {
    if (used.count(2 * mul))
      ;
    else
      good.push_back(mul * 2);
    ++mul;
  }
  for (int a : skipped) good.push_back(a);
  for (int start = 0; start + 1 < good.size(); start += 2)
    res.push_back({good[start], good[start + 1]});
  cout << res.size() << endl;
  for (auto a : res) printf("%d %d\n", a.first, a.second);
  return 0;
}
