#include <bits/stdc++.h>
using namespace std;
bool is_prime[100005];
vector<int> prime;
bool match[100005];
void solve(int n) {
  for (int i = 0; i <= n; i++) is_prime[i] = true;
  is_prime[1] = false;
  for (int i = 2; i <= n; i++) {
    if (is_prime[i]) {
      prime.push_back(i);
      for (int j = 2 * i; j <= n; j += i) is_prime[j] = false;
    }
  }
}
vector<pair<int, int> > v;
int main() {
  int n;
  cin >> n;
  solve(n);
  match[1] = true;
  for (int i = n / 2 + 1; i <= n; i++)
    if (is_prime[i]) match[i] = true;
  is_prime[2] = false;
  for (int i = 2; i <= n / 2; i++) {
    int cal = 0;
    if (is_prime[i]) {
      for (int k = 1; k * i <= n; k++)
        if (!match[k * i]) cal++;
      if (cal % 2 == 0) {
        int id = 0, a, b;
        for (int j = 1; j * i <= n; j++) {
          if (!match[j * i]) {
            id++;
            if (id == 2) {
              b = i * j;
              v.push_back(make_pair(a, b));
              match[a] = true;
              match[b] = true;
              id = 0;
            } else if (id == 1) {
              a = i * j;
            }
          }
        }
      } else {
        int dd;
        for (int k = 1; k * i <= n; k++)
          if (k * i % 2 == 0 && !match[i * k]) {
            dd = i * k;
            break;
          }
        int id = 0, a, b;
        for (int j = 1; j * i <= n; j++) {
          if (!match[j * i] && j * i != dd) {
            id++;
            if (id == 2) {
              b = i * j;
              v.push_back(make_pair(a, b));
              match[a] = true;
              match[b] = true;
              id = 0;
            } else if (id == 1) {
              a = i * j;
            }
          }
        }
      }
    }
  }
  int cal = 0, a, b;
  for (int i = 2; i <= n; i++) {
    if (!match[i]) {
      cal++;
      if (cal == 2) {
        b = i;
        v.push_back(make_pair(a, b));
        match[a] = true;
        match[b] = true;
        cal = 0;
      } else if (cal == 1) {
        a = i;
      }
    }
  }
  cout << v.size() << endl;
  for (int i = 0; i < v.size(); i++)
    cout << v[i].first << " " << v[i].second << endl;
}
