#include <bits/stdc++.h>
using namespace std;
const long long N = 1e5 + 5;
long long n;
long long sieve[N], vis[N];
vector<pair<long long, long long> > ans;
void preprocess() {
  fill(sieve + 2, sieve + N, 1);
  for (long long i = 2; i < N; i++) {
    if (!sieve[i]) continue;
    for (long long j = 2; i * j < N; j++) sieve[i * j] = 0;
  }
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  preprocess();
  cin >> n;
  for (long long i = n / 2; i >= 2; i--) {
    if (!sieve[i]) continue;
    vector<long long> v;
    long long cur = i;
    while (cur <= n) {
      if (vis[cur]) {
        cur += i;
        continue;
      }
      v.push_back(cur);
      vis[cur] = 1;
      cur += i;
    }
    if (v.size() > 2 && v.size() % 2) {
      vis[v[1]] = 0;
      v.erase(v.begin() + 1, v.begin() + 2);
    }
    for (long long j = 0; j < v.size(); j += 2) {
      ans.push_back({v[j], v[j + 1]});
    }
  }
  cout << ans.size() << "\n";
  for (auto &it : ans) cout << it.first << " " << it.second << "\n";
  return 0;
}
