import scala.collection.mutable.* import scala.io.StdIn.* import scala.util.chaining.* import scala.math.* import scala.reflect.ClassTag import scala.util.* import scala.annotation.tailrec import scala.collection.mutable import scala.language.strictEquality @main def main = val a = readLine.toLong if a == 0L then println("2 0") else if a == 1L then println("2 1") println("1 2") else if a == 2L then println("4 4") println("1 2") println("1 3") println("2 4") println("3 4") else val maxLength = (a - 1).toBinaryString val edges = mutable.Set[(Int, Int)]() val nodes = mutable.ArrayDeque[Int]().addAll(1 to 128) val start = nodes.removeHead() val single = Array.fill(maxLength.length){nodes.removeHead()} val double = Array.fill(maxLength.length - 1){Array.fill(2){nodes.removeHead()}} val branch = nodes.removeHead() val goal = nodes.removeHead() edges.add(start -> single(0)) for i <- 1 until single.length do edges.add(single(i - 1) -> single(i)) edges.add(single.last -> goal) for v <- double(0) do edges.add(start -> v) for i <- 1 until double.length v <- double(i - 1) u <- double(i) do edges.add(v -> u) for v <- double.last do edges.add(v -> branch) edges.add(branch -> goal) val rest = a - 1 for i <- double.indices do if (rest >> i) % 2 == 1L then edges.add(double(i)(0) -> single(i + 1)) println(s"$goal ${edges.size}") println(edges.map((u, v) => s"$u $v").mkString("\n"))