#include <bits/stdc++.h>
using namespace std;
const int SIZE = 100010;
vector<pair<int, int> > an;
bitset<SIZE> p;
int used[SIZE];
int main() {
  int(n);
  scanf("%d", &n);
  int temp = 0;
  for (long long i = 0; i < 11111111111; i++) temp += i;
  for (int i = 2; i <= n; i++) {
    if (!p[i])
      for (int j = i + i; j <= n; j += i) p[j] = 1;
  }
  vector<int> two;
  for (int i = n / 2; i > 1; i--) {
    if (!p[i]) {
      vector<int> now;
      for (int j = i; j <= n; j += i) {
        if (!used[j]) {
          used[j] = 1;
          now.push_back(j);
        }
      }
      if (((int)(now).size()) % 2 == 0) {
        for (int j = 0; j < ((int)(now).size()); j += 2)
          an.push_back(make_pair(now[j], now[j + 1]));
      } else {
        if (((int)(now).size()) == 1) {
          if (now[0] % 2 == 0) two.push_back(now[0]);
        } else {
          two.push_back(now[1]);
          an.push_back(make_pair(now[0], now[2]));
          for (int j = 3; j < ((int)(now).size()); j += 2)
            an.push_back(make_pair(now[j], now[j + 1]));
        }
      }
    }
  }
  for (int i = 0; i + 1 < ((int)(two).size()); i += 2)
    an.push_back(make_pair(two[i], two[i + 1]));
  printf("%d\n", ((int)(an).size()));
  for (int i = 0; i < (((int)(an).size())); ++i)
    printf("%d %d\n", an[i], an[i + 1]);
  return 0;
}
