#include <bits/stdc++.h>
using namespace std;
int n, taken[100001];
vector<pair<int, int> > res;
int main() {
  scanf("%d", &n);
  if (n <= 3) {
    cout << 0 << endl;
    return 0;
  }
  for (int i = 3; i <= n; i++) {
    if (taken[i] == 0) {
      vector<int> choose;
      choose.push_back(i);
      for (int j = i + i; j <= n; j += i) {
        if (taken[j] == 0) {
          choose.push_back(j);
        }
      }
      if (choose.size() == 1) continue;
      if (choose.size() % 2 == 0) {
        for (__typeof(choose.begin()) it(choose.begin()); it != choose.end();
             it++)
          taken[*it] = 1;
        for (int j = 0; j < choose.size(); j += 2) {
          res.push_back(make_pair(choose[j], choose[j + 1]));
        }
      } else {
        taken[choose[0]] = taken[choose[2]] = 1;
        res.push_back(make_pair(choose[0], choose[2]));
        for (int j = 3; j < choose.size(); j += 2) {
          res.push_back(make_pair(choose[j], choose[j + 1]));
          taken[choose[j]] = taken[choose[j + 1]] = 1;
        }
      }
    }
  }
  vector<int> choose;
  for (int i = 2; i <= n; i += 2) {
    if (taken[i] == 0) choose.push_back(i);
  }
  for (int i = 1; i < choose.size(); i += 2) {
    res.push_back(make_pair(choose[i - 1], choose[i]));
  }
  printf("%d\n", (int)res.size());
  for (__typeof(res.begin()) it(res.begin()); it != res.end(); it++)
    printf("%d %d\n", it->first, it->second);
  return 0;
}
