#include <bits/stdc++.h>
using namespace std;
void read_file(bool outToFile = true) {}
bitset<50 + 1> isPrime;
vector<int> prime;
void sieve() {
  isPrime.set();
  isPrime[0] = isPrime[1] = 0;
  for (int i = 2; i <= 50; i++) {
    if (isPrime[i]) {
      prime.push_back(i);
      for (long long j = 1LL * i * i; j <= 50; j += i) isPrime[int(j)] = 0;
    }
  }
}
bool is_prime(long long n) {
  if (n < 0) return false;
  if (n <= 50) return isPrime[n];
  int idx = 0;
  int pf = prime[idx];
  while (1LL * pf * pf <= n) {
    if (n % pf == 0) return false;
    pf = prime[++idx];
  }
  return true;
}
bool is_prime1(int x) {
  for (int i = 2; i * i <= x; i++)
    if (x % i == 0) return false;
  return true;
}
int upper_prime(int n) {
  while (!is_prime1(n)) n--;
  return n;
}
int main() {
  read_file();
  sieve();
  int n;
  while (cin >> n) {
    if (is_prime1(n)) {
      cout << 1 << endl;
      cout << n << endl;
      continue;
    }
    if (is_prime1(n - 2)) {
      cout << 2 << endl;
      cout << 2 << ' ' << n - 2 << endl;
      continue;
    }
    if (is_prime1(n - 4)) {
      cout << 3 << endl;
      printf("%d %d %d\n", 2, 2, n - 4);
      continue;
    }
    int x, y, z;
    x = upper_prime(n);
    n -= x;
    for (int i = 0; i < prime.size(); i++) {
      y = prime[i];
      z = n - y;
      if (is_prime1(z)) break;
    }
    cout << 3 << endl;
    cout << x << ' ' << y << ' ' << z << endl;
  }
}
