#include #include #include #include #include #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) void solve(){ } ll inf = 4e18; ll sum(ll k, ll l){ ll s = 2*k + l - 1; if(s > 2e18/l){ return inf; }else{ return s*l/2; } } int main(){ ll n; cin >> n; ll e = 0; ll b = 2; if(n == 2){ cout << 1 << endl; cout << "1 2 2" << endl; return 0; } while(b <= n){ b*=2; e++; } vvll ans; for(ll l = 1; l*(l+1)/2 <= n; l++){ if(l == 1){ ans.push_back({1, n, n}); continue; } if(sum(1, l) == n){ ans.push_back({1, 1, l}); continue; } ll left = 1, right = n - l; ll mid; while(right - left > 1){ mid = (left+right)/2; if(sum(mid, l) <= n){ left = mid; }else{ right = mid; } } if(sum(left, l) == n){ ans.push_back({1, left, l+left-1}); } }reverse(all(ans)); rep2(i, 2, min(e+1, (ll)31)){ queue q; ll s = 0; for(ll r = 1; pow(r, i) <= n; r++){ q.push(r); while(s > n - pow(r, i)){ auto u = q.front(); q.pop(); s -= pow(u, i); }s += pow(r, i); if(s == n){ ans.push_back({i, q.front(), r}); } } } rep2(i, 31, e+1){ if((ll)1 + pow(2, i) == n)ans.push_back({i, 1, 2}); if(pow(2, i) == n)ans.push_back({i, 2, 2}); } cout << ans.size() << endl; for(auto v : ans){ for(auto i : v)cout << i << " "; cout << endl; } return 0; }