#!/usr/bin/python3 import sys, math, os #import re, string, fractions, itertools #import bisect, heapq #from fractions import Fraction #from functools import reduce LocaL = "MATE_DESKTOP_SESSION_ID" in os.environ def mle_assert(x): if LocaL: assert x elif not x: x = list(range(10**8)) def tle_assert(x): if LocaL: assert x elif not x: for i in range(10000): for j in range(1000): for k in range(1000): pass sys.setrecursionlimit(10000) #Z = 10**9 + 7 ssr = sys.stdin.readline ssw = sys.stdout.write ssf = sys.stdout.flush sew = sys.stderr.write def rdline(): return ssr().strip() def rdstrs(): return ssr().split() def rdints(): return list(map(int, ssr().split())) def rd1int(): return int(rdline()) def do_one_case(cnum): N = rd1int() D = rdints() assert len(D)==N D = [ d-1 for d in D ] C = rdints() assert len(C)==N ans = 0 v = N*[False] P = [ set() for i in range(N) ] cy = N*[-99] CL = set() for i in range(N): if not v[i]: #print(f"i = {i}") v[i] = True cy[i] = -9 j = D[i] P[j].add(i) while cy[j] < -22: #print(f"j = {j}") v[j] = True cy[j] = -9 jj = j j = D[j] P[j].add(jj) c = j if cy[j]<0 else cy[j] CL.add(c) cy[i] = c j = D[i] while cy[j]<0: #print(f",j = {j}") cy[j] = c j = D[j] for i in range(N): l = sum(C[k] for k in P[i]) ans += max(0, C[i]-l) for i in CL: #print(f".i = {i}") jj = i j = D[i] m = 999999999999999999 while True: #print(f".j = {j}") l = sum(C[k] for k in P[j]) l -= C[jj] l = max(0, C[j]-l) l = min(l, C[jj]) m = min(m,l) if j==i: break jj = j j = D[j] ans += m print(f"Case #{cnum}: {ans}") def main(): T = rd1int() for i in range(T): do_one_case(i+1) sys.stdout.flush() if __name__ == "__main__": main()