#include #include using namespace std; using namespace atcoder; using ll = long long; using mint = modint998244353; using vi = vector; using vvi = vector; using vvvi = vector; using vll = vector; using vvll = vector; using vvvll = vector; using vmi = vector; using vvmi = vector; using vvvmi = vector; #define all(a) (a).begin(), (a).end() #define rep2(i, m, n) for (int i = (m); i < (n); ++i) #define rep(i, n) rep2(i, 0, n) #define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i) #define drep(i, n) drep2(i, n, 0) using t = tuple; void solve(){ } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; set st; if(n % 3 == 0){ int y = (int)sqrt(n/3); if(y*y == n/3){ st.insert({y, y, y}); } } for(int x = 1; x*x <= n; x++){ int c = n - x*x; if(c < 0)break; if(c % (2*x) != 0)continue; int z = c / (2*x); if(x == z)continue; st.insert({x, x, z}); st.insert({x, z, x}); st.insert({z, x, x}); } for(int x = 0; x*x <= n; x++){ for(int y = x+1; y*y <= n; y++){ int c = n - x*y; if(c < 0)break; if(c % (x+y) != 0)continue; int z = c/(x+y); if(z <= y)continue; st.insert({x, y, z}); st.insert({x, z, y}); st.insert({y, x, z}); st.insert({y, z, x}); st.insert({z, x, y}); st.insert({z, y, x}); } } cout << st.size() << endl; for(auto u : st){ auto [a, b, c] = u; cout << a << " " << b << " " << c << endl; } return 0; }