import sys def find_largest_divisor(n, max_limit): if n == 1: return 1 for d in range(min(n, max_limit), 0, -1): if n % d == 0: return d return 1 def factorize_a(A): if A == 0: return [] factors = [] while A > 1: d = find_largest_divisor(A, 126) if d == 1: factors.append(1) break factors.append(d) A = A // d return factors def main(): A = int(sys.stdin.readline()) if A == 0: print("1 0") return factors = factorize_a(A) sum_factors = sum(factors) if sum_factors == 0: print("1 0") return if sum_factors > 126: print("1 0") return N = 1 + sum_factors + 1 edges = [] current_node = 1 # Connect node 1 to layer 1 layer_size = factors[0] for i in range(layer_size): node = current_node + i + 1 edges.append((1, node)) current_node += layer_size # Connect layers between each other for i in range(len(factors) - 1): s = factors[i] t = factors[i+1] start_u = current_node - s + 1 end_u = current_node end_v = current_node + t for u in range(start_u, end_u + 1): for v in range(current_node + 1, end_v + 1): edges.append((u, v)) current_node += t # Connect last layer to N s = factors[-1] start_u = current_node - s + 1 end_u = current_node for u in range(start_u, end_u + 1): edges.append((u, N)) print(f"{N} {len(edges)}") for edge in edges: print(f"{edge[0]} {edge[1]}") if __name__ == "__main__": main()