#include <bits/stdc++.h>
using namespace std;
const int block_size = 320;
const long long mod = 1e9 + 7;
const long double eps = 1e-9;
const int inf = mod;
const double PI = atan(1) * 4;
template <typename T>
inline int sign(const T &a) {
  if (a < 0) return -1;
  if (a > 0) return 1;
  return 0;
}
template <typename T>
inline void in(T &x) {
  x = 0;
  T f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  x *= f;
}
const int maxn = 100010;
bool used[maxn];
vector<pair<int, int> > ans;
void getAns(vector<int> &v) {
  for (int i = 1; i < ((int)v.size()); i += 2) {
    ans.push_back(make_pair(v[i], v[i - 1]));
  }
}
int main() {
  int n;
  cin >> n;
  for (int i = 3; i <= n; i++) {
    if (!used[i] && i % 2 != 0) {
      vector<int> temp;
      for (int j = i; j <= n; j += i) {
        if (used[j]) continue;
        if (j == 2 * i) continue;
        temp.push_back(j);
        used[j] = 1;
      }
      if (((int)temp.size()) & 1 && 2 * i <= n) {
        temp.push_back(2 * i);
        used[2 * i] = 1;
      }
      getAns(temp);
    }
  }
  vector<int> temp;
  for (int i = 2; i <= n; i += 2) {
    if (!used[i]) temp.push_back(i);
  }
  getAns(temp);
  cout << ((int)ans.size()) << endl;
  ;
  for (auto i : ans) {
    cout << i.first << ' ' << i.second << endl;
  }
  return 0;
}
