#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <sstream>
#include <cmath>
#include <cassert>
using namespace std;
 
struct Triple {
        unsigned int values[3];
        Triple(unsigned int newA, unsigned int newB, unsigned int newC) 
         : values{newA, newB, newC} {}
        unsigned int a() const  { return values[0]; }
        unsigned int b() const { return values[1]; }
        unsigned int c() const { return values[2]; }
        unsigned int sum() const { return accumulate(values, values + 3, 0); }
        bool operator<(const Triple& second) const {
                return lexicographical_compare(values, values + 3,
                                               second.values, second.values + 3);
        }
};
 
Triple getTriple(unsigned int k, unsigned int m, unsigned int n) {
        assert(m > n);
        return {k*(m*m-n*n), k*2*m*n, k*(m*m + n*n)};
}
 
set<unsigned int> factors(unsigned int n) {
        set<unsigned int> res;
        unsigned int root = sqrt(n);
        for(unsigned int i = 1; i <= root; i++) {
                if(n % i == 0) {
                        res.insert(i);
                        res.insert(n/i);
                }
        }
        return res;
}
 
set<Triple> triangles(unsigned int sum) {
        auto factorSet = factors(sum);
        set<Triple> results;
        for(unsigned int k : factorSet)
        for(unsigned int m : factorSet) {
                unsigned int n = sum/(2*m*k) - m;
                if( !n || !((m - n) % 2) || (n >= m) || k*2*m*m >= sum)
                        continue;
 
                Triple triple = getTriple(k, m, n);
                if(triple.sum() == sum)
                        results.insert(triple);
        }
        return results;
}
 
int main(int argc, char** argv) {
        unsigned int amount;
        if(argc != 2) {
                cin >> amount;
        }
        else {
                stringstream ss(argv[1]);
                ss >> amount;
        }
        auto results = triangles(amount);
        for(auto& triple : results) {
                cout << triple.a() << " " << triple.b() << " " << triple.c() << "\n";
        }
}