#!/usr/bin/env python3 def min_remove(D): m = len(D) for k in range(1, len(D)): BT = [] V = [None] * len(D) r = len(D) - 1 - max_edges(D, BT, V, k) if m is None or r < m: m = r return m def max_edges(D, BT, V, k): if V[k] is None: BT.append(k) if len(D[k]) <= 1: # Either one edge (parent) or two (parent and one child) BT.remove(k) V[k] = 1 else: m1 = None m2 = None for e in D[k]: if e in BT: continue d = max_edges(D, BT, V, e) if m1 is None or d > m1: m2 = m1 m1 = d elif m2 is None or d > m2: m2 = d BT.remove(k) if m2 is None: V[k] = 1 else: V[k] = 1 + m1 + m2 return V[k] if __name__ == "__main__": t = int(input()) for i in range(1, t+1): n = int(input()) D = [None] * (n+1) for j in range(n-1): string = input().split(' ') a, b = int(string[0]), int(string[1]) if D[a] is None: D[a] = [b] else: D[a].append(b) if D[b] is None: D[b] = [a] else: D[b].append(a) print("Case #" + str(i) + ": " + str(min_remove(D)))