#include <bits/stdc++.h>
const int N = 1e5 + 2;
using namespace std;
bool used[N], isprime[N];
vector<pair<int, int> > ans_lis;
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, i, j, k, l;
  cin >> n;
  for (i = 2; i <= n; i++) {
    if (!isprime[i]) {
      if (i <= n / i) {
        for (j = i * i; j <= n; j += i) {
          isprime[j] = true;
        }
      }
    }
  }
  for (i = n; i > 1; i--) {
    if (!isprime[i] && i <= n / 2) {
      vector<int> temp;
      for (j = i; j <= n; j += i) {
        if (!used[j]) {
          temp.push_back(j);
        }
      }
      if (temp.size() % 2 == 1) {
        l = 0;
        for (auto cac : temp) {
          if (cac != 2 * i) {
            l++;
            used[cac] = true;
            if (l == 2) {
              ans_lis.push_back({cac, k});
              l = 0;
            } else {
              k = cac;
            }
          }
        }
      } else {
        l = 0;
        for (auto cac : temp) {
          l++;
          used[cac] = true;
          if (l == 2) {
            ans_lis.push_back({cac, k});
            l = 0;
          } else {
            k = cac;
          }
        }
      }
    }
  }
  cout << ans_lis.size() << "\n";
  for (auto cac : ans_lis) {
    cout << cac.first << " " << cac.second << "\n";
  }
}
