#include <bits/stdc++.h>
using namespace std;
vector<int> primes;
bool mark[100002];
bool ar[100002];
void func(int n) {
  for (int i = 2; i * i <= n; i++)
    if (ar[i])
      continue;
    else
      for (int j = 2; i * j <= n; j++) ar[i * j] = true;
  for (int j = 3; j <= n / 2; j++)
    if (!ar[j]) primes.push_back(j);
  vector<pair<int, int> > ans;
  vector<int> temp;
  for (int i = 0; i < primes.size(); i++) {
    vector<int> v;
    for (int j = 3 * primes[i]; j <= n; j += primes[i])
      if (!mark[j]) {
        mark[j] = true;
        v.push_back(j);
      }
    if (!mark[primes[i]]) {
      mark[primes[i]] = true;
      v.push_back(primes[i]);
    }
    if (v.size() % 2 == 0) {
      if (!mark[2 * primes[i]]) {
        mark[2 * primes[i]] = true;
        temp.push_back(2 * primes[i]);
      }
      for (int i = 0; i < v.size(); i = i + 2)
        ans.push_back(make_pair(v[i], v[i + 1]));
    } else {
      if (!mark[2 * primes[i]]) {
        mark[2 * primes[i]] = true;
        v.push_back(2 * primes[i]);
      }
      for (int i = 0; i < v.size(); i = i + 2)
        if (i + 1 < v.size()) ans.push_back(make_pair(v[i], v[i + 1]));
    }
  }
  for (int j = 2; j <= n; j = j + 2)
    if (!mark[j]) temp.push_back(j);
  for (int i = 0; i < temp.size(); i = i + 2)
    if (i + 1 < temp.size()) ans.push_back(make_pair(temp[i], temp[i + 1]));
  cout << ans.size() << endl;
  for (int i = 0; i < ans.size(); i++)
    cout << ans[i].first << " " << ans[i].second << endl;
}
int main() {
  ios_base::sync_with_stdio(false);
  int n;
  cin >> n;
  func(n);
  return 0;
}
