from itertools import accumulate def divisors(n: int) -> list[int]: """n の約数を求める""" s = set() p = 1 while p * p <= n: if n % p == 0: s.add(p) s.add(n // p) p += 1 return sorted(s) def accum(a: list): acc = list(accumulate(a)) return lambda l, r: acc[r] - (acc[l-1] if l > 0 else 0) def solve_k(n: int, k: int): assert k > 1 a = [] i = 0 while True: x = pow(i, k) if x > n: break a.append(x) i += 1 acc = accum(a) ans = [] for i in range(1, len(a)): if a[i] > n: break lo = i hi = len(a)-1 while lo <= hi: m = (lo + hi) // 2 x = acc(i, m) if x == n: ans.append((k, i, m)) break elif x > n: hi = m - 1 else: lo = m + 1 return ans def solve_k1(n: int): divs = divisors(2 * n) res = [] for k in divs: a = (2*n//k - k + 1) // 2 # 検算 s = (a + (a+k-1)) * k // 2 if s == n and a > 0: res.append((1, a, a+k-1)) return sorted(res) N = int(input()) ans = solve_k1(N) for i in range(2, 41): if pow(2, i) > N: break res = solve_k(N, i) ans.extend(res) print(len(ans)) for k, l, r in ans: print(k, l, r)