using System; using static System.Console; using System.Linq; using System.Collections.Generic; using System.Globalization; class Program { static long NN => long.Parse(ReadLine()); public static void Main() { Solve(); // Test(); } // static void Test() // { // var r = new Random(); // var count = 0; // while (true) // { // var n = r.NextInt64(2, 1_000_000_000_001); // var s2 = Power(n); // if (!Check(n, s2)) // { // WriteLine(n); // // WriteLine(string.Join("\n", map.Select(m => string.Join(" ", m)))); // // WriteLine(string.Join(" ", a)); // // WriteLine(s1); // WriteLine(s2); // return; // } // ++count; // if (count % 10 == 0) WriteLine(count); // } // } // static bool Check(long n, List<(int e, long l, long r)> ans) // { // foreach (var ai in ans) // { // if (ai.e < 1 || ai.l < 1 || ai.r < 1) return false; // if (ai.e == 1) // { // if ((ai.l + ai.r) * (ai.r - ai.l + 1) / 2 != n) return false; // } // else // { // var sum = 0L; // for (var i = ai.l; i <= ai.r; ++i) // { // var m = 1L; // for (var k = 0; k < ai.e; ++k) m *= i; // sum += m; // } // if (sum != n) return false; // } // } // return true; // } static void Solve() { var n = NN; var ans = Power(n); WriteLine(ans.Count); if (ans.Count > 0) WriteLine(string.Join("\n", ans.Select(ai => $"{ai.e} {ai.l} {ai.r}"))); } static List<(int e, long l, long r)> Power(long n) { var ans = new List<(int e, long l, long r)>(); // E=1 : R=L+aとすると a(a+2L+1) = 2N var p = PList(2 * n); foreach (var a in p) { var b = 2 * n / a; if (a >= b) break; var l2 = b - a - 1; if (l2 > 0 && l2 % 2 == 0) { ans.Add((1, l2 / 2 + 1, l2 / 2 + a)); } } // E>1 for (var e = 2; e <= 40; ++e) { var cum = new List(); cum.Add(0); var j = 0; for (var i = 1; i <= 1_000_000; ++i) { // var m = (long)Math.Pow(i, e); var m = 1L; for (var k = 0; k < e; ++k) m *= i; if (m > n) break; cum.Add(cum[^1] + m); while (j < i && cum[i] - cum[j] > n) ++j; if (cum[i] - cum[j] == n) ans.Add((e, j + 1, i)); } } ans.Sort((l, r) => { var d = l.e.CompareTo(r.e); if (d != 0) return d; d = l.l.CompareTo(r.l); if (d != 0) return d; return l.r.CompareTo(r.r); }); return ans; } static List PList(long a) { var ans = new List(); var rev = new List(); for (var i = 1L; i * i <= a; ++i) { if (a % i == 0) { ans.Add(i); if (i * i < a) rev.Add(a / i); } } rev.Reverse(); return ans.Concat(rev).ToList(); } }