#include <bits/stdc++.h>
using namespace std;
const int MAXP = 1e5;
set<int> primes;
void sieve() {
  vector<bool> flag(MAXP);
  for (int p = 2; p < MAXP; p++)
    if (!flag[p]) {
      primes.insert(p);
      for (int x = p + p; x < MAXP; x += p) flag[x] = true;
    }
}
bool is_prime(int n) {
  if (n < MAXP) return primes.count(n);
  for (auto p : primes) {
    if ((long long)p * p > n) break;
    if (n % p == 0) return false;
  }
  return true;
}
pair<int, int> two_prime(int n) {
  assert(n <= 300 && (n & 1) == 0 && n != 2);
  for (auto p : primes) {
    if (p > n / 2) break;
    if (primes.count(n - p)) return {p, n - p};
  }
  assert(false);
  return {0, 0};
}
int main() {
  sieve();
  int n;
  scanf("%d", &n);
  if (is_prime(n))
    printf("1\n%d\n", n);
  else if (is_prime(n - 2))
    printf("2\n%d %d\n", 2, n - 2);
  else {
    for (int x = 4; x <= 300; x += 2)
      if (is_prime(n - x)) {
        pair<int, int> r = two_prime(x);
        printf("3\n%d %d %d\n", r.first, r.second, n - x);
        break;
      }
  }
}
