#include <bits/stdc++.h>
using namespace std;
const long long inf = numeric_limits<long long>::max(), MAX = 1e5,
                MOD = 1e9 + 7;
vector<long long> primes;
bool is_composite[MAX + 1];
void compute_primes() {
  for (long long i = 2; i < MAX + 1; i++) {
    if (!is_composite[i]) {
      primes.push_back(i);
    }
    for (auto p : primes) {
      long long j = i * p;
      if (j > MAX) break;
      is_composite[j] = true;
      if (i % p == 0) break;
    }
  }
}
bool is_prime(long long n) {
  if (n < 2) return false;
  if (n <= MAX) return !is_composite[n];
  for (auto p : primes)
    if (n % p == 0) return false;
  return true;
}
long long f(long long n) {}
int main() {
  compute_primes();
  long long n;
  cin >> n;
  if (is_prime(n)) {
    cout << 1 << "\n" << n << endl;
  } else if (is_prime(n - 2)) {
    cout << 2 << "\n" << 2 << " " << n - 2 << endl;
  } else if (is_prime(n - 4)) {
    cout << 3 << "\n" << 2 << " " << 2 << " " << n - 4 << endl;
  } else {
    long long p1 = n;
    while (!is_prime(p1)) p1--;
    auto pit = primes.begin();
    while (!is_prime(n - p1 - *pit)) pit++;
    cout << 3 << "\n";
    cout << n - *pit - p1 << " " << *pit << " " << p1 << endl;
  }
}
