#include void merge_sort(int n, int x[][3]) { static int y[1000001][3] = {}; if (n <= 1) return; merge_sort(n / 2, &(x[0])); merge_sort((n + 1) / 2, &(x[n/2])); int i, p, q; for (i = 0, p = 0, q = n / 2; i < n; i++) { if (p >= n / 2) { y[i][0] = x[q][0]; y[i][1] = x[q][1]; y[i][2] = x[q++][2]; } else if (q >= n) { y[i][0] = x[p][0]; y[i][1] = x[p][1]; y[i][2] = x[p++][2]; } else if (x[p][0] < x[q][0] || (x[p][0] == x[q][0] && x[p][1] < x[q][1]) || (x[p][0] == x[q][0] && x[p][1] == x[q][1] && x[p][2] < x[q][2])) { y[i][0] = x[p][0]; y[i][1] = x[p][1]; y[i][2] = x[p++][2]; } else { y[i][0] = x[q][0]; y[i][1] = x[q][1]; y[i][2] = x[q++][2]; } } for (i = 0; i < n; i++) { x[i][0] = y[i][0]; x[i][1] = y[i][1]; x[i][2] = y[i][2]; } } int main() { int N; scanf("%d", &N); int T = 0, x, y, z; static int ans[1000001][3]; for (x = 0; x * x * 3 <= N; x++) { for (y = x; x * y * 3 <= N && y * y <= N; y++) { if (x + y == 0 || (N - x * y) % (x + y) != 0) continue; z = (N - x * y) / (x + y); if (z < y) break; ans[T][0] = x; ans[T][1] = y; ans[T++][2] = z; if (x != y) { ans[T][0] = y; ans[T][1] = x; ans[T++][2] = z; } if (y != z) { ans[T][0] = x; ans[T][1] = z; ans[T++][2] = y; } if (z != x) { ans[T][0] = z; ans[T][1] = y; ans[T++][2] = x; } if (x != y && y != z) { ans[T][0] = y; ans[T][1] = z; ans[T++][2] = x; ans[T][0] = z; ans[T][1] = x; ans[T++][2] = y; } } } merge_sort(T, ans); int i; printf("%d\n", T); for (i = 0; i < T; i++) printf("%d %d %d\n", ans[i][0], ans[i][1], ans[i][2]); fflush(stdout); return 0; }