#include <bits/stdc++.h>
using namespace std;
bool isprime[100000 + 10];
long prime[100000 + 10];
long int s;
void seive() {
  memset(isprime, true, sizeof(isprime));
  isprime[0] = isprime[1] = false;
  s = 0;
  for (long i = 2; i <= 100000; i++) {
    if (!isprime[i]) continue;
    prime[s++] = i;
    for (long j = 2 * i; j <= 100000; j += i) isprime[j] = false;
  }
}
bool isp(long int n) {
  if (n <= 100000) return isprime[n];
  long root = (long)sqrt(n) + 1;
  long int i = 0;
  while (prime[i] <= root) {
    if (n % prime[i] == 0) return false;
    i++;
  }
  return true;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long int n;
  cin >> n;
  seive();
  if (n <= 100000) {
    if (isprime[n]) {
      cout << 1 << endl << n << endl;
      return 0;
    }
  }
  if (n == 4) {
    cout << 2 << endl << 2 << " " << 2 << endl;
    return 0;
  }
  if (n == 6) {
    cout << 2 << endl << 3 << " " << 3 << endl;
    return 0;
  }
  if (n % 2 == 1) {
    cout << 3 << endl;
    cout << 3 << " ";
    n -= 3;
  } else
    cout << 2 << endl;
  long int p1, p2;
  for (long i = 0; prime[i] <= 5569; i++) {
    p1 = prime[i];
    p2 = n - prime[i];
    if (isp(p2)) {
      cout << p1 << " " << p2 << endl;
      return 0;
    }
  }
  return 0;
}
