#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const int N = 5 + 1e5;
const int INF = 1e9;
bool isPrime[N], T[N];
vector<int> primes;
vector<pair<int, int>> ans;
vector<int> te;
void sieve(int n) {
  memset(isPrime, 1, sizeof isPrime);
  isPrime[0] = isPrime[1] = 0;
  for (int i = 2; i * i <= n; i++) {
    if (isPrime[i]) {
      for (int j = i * i; j <= n; j += i) isPrime[j] = 0;
    }
  }
  for (int i = 0; i <= n; i++)
    if (isPrime[i]) primes.push_back(i);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  sieve(100000);
  int n;
  cin >> n;
  reverse(primes.begin(), primes.end());
  for (auto x : primes) {
    for (int i = x; i <= n; i += x) {
      if (!T[i]) te.push_back(i);
    }
    int m = te.size();
    if (m & 1) {
      if (m > 2) te.erase(te.begin() + 1);
      m--;
    }
    for (int j = 0; j < m; j += 2) {
      ans.push_back({te[j], te[j + 1]});
      T[te[j]] = 1;
      T[te[j + 1]] = 1;
    }
    te.clear();
  }
  n = ans.size();
  cout << n << "\n";
  for (int i = 0; i < n; ++i)
    cout << ans[i].first << " " << ans[i].second << "\n";
}
