# 公式解説を見てからやった
# 複数サイクルでき、1-K回移動可能
# N < 5000?多分、O(N * 2N)くらいで行けそうに見えるが。。。

if __name__ == "__main__":

	N,K = map(int,input().split())
	P = [ int(p)-1 for p in input().split() ]
	C = list(map(int,input().split()))

	# 一度計算したサイクル情報を一応キャッシュしておく。。。
	# あんまり意味なさそう
	cycleIDs = [ -1 for _ in range(N) ]
	cycleInfs = []


	# print(P)

	ans = -1e19
	cycleID = 0

	for n in range(N):

		v = n
		currentCycleItemCnt = 0
		currentCycleTotal = 0

		if cycleIDs[v] != -1:
			currentCycleItemCnt, currentCycleTotal = cycleInfs[ cycleIDs[v] ]
			# print(currentCycleItemCnt, currentCycleTotal)
		else:
			while True:
				# 全頂点について、属するサイクルを計算する
				currentCycleItemCnt += 1
				currentCycleTotal += C[v]

				v = P[v]
				if v == n:
					# サイクル発見
					cycleInfs.append( (currentCycleItemCnt, currentCycleTotal) )
					cycleID += 1
					break

				# 一応、一度サイクルを計算した頂点については、
				# その頂点の属するサイクルの情報をメモっておく。。。
				cycleIDs[v] = cycleID

		procCnt = 0
		currentCycleSumTmp = 0

		for k in range(min(K,currentCycleItemCnt)):
			# 頂点vにコマが置かれた時の最高スコアを計算し、
			# これまでの最高スコアを上回ったら、これまでの最高スコアを更新する
			procCnt = k+1
			currentCycleSumTmp += C[v]

			cycleLoopCnt = 0
			if 0 < currentCycleTotal:
				cycleLoopCnt = int(( K - procCnt ) // currentCycleItemCnt)

			# print("v=", v, "currentCycleSumTmp=", currentCycleSumTmp, "procCnt, cycleLoopCnt, currentCycleTotal=", procCnt, cycleLoopCnt, currentCycleTotal)
			ans = max( ans, currentCycleSumTmp + cycleLoopCnt * currentCycleTotal )
			v = P[v]


	print(ans) if __name__ == "__main__":

	N,K = map(int,input().split())
	P = [ int(p)-1 for p in input().split() ]
	C = list(map(int,input().split()))

	# 一度計算したサイクル情報を一応キャッシュしておく。。。
	# あんまり意味なさそう
	cycleIDs = [ -1 for _ in range(N) ]
	cycleInfs = []


	# print(P)

	ans = -1e19
	cycleID = 0

	for n in range(N):

		v = n
		currentCycleItemCnt = 0
		currentCycleTotal = 0

		if cycleIDs[v] != -1:
			currentCycleItemCnt, currentCycleTotal = cycleInfs[ cycleIDs[v] ]
			# print(currentCycleItemCnt, currentCycleTotal)
		else:
			while True:
				# 全頂点について、属するサイクルを計算する
				currentCycleItemCnt += 1
				currentCycleTotal += C[v]

				v = P[v]
				if v == n:
					# サイクル発見
					cycleInfs.append( (currentCycleItemCnt, currentCycleTotal) )
					cycleID += 1
					break

				# 一応、一度サイクルを計算した頂点については、
				# その頂点の属するサイクルの情報をメモっておく。。。
				cycleIDs[v] = cycleID

		procCnt = 0
		currentCycleSumTmp = 0

		for k in range(min(K,currentCycleItemCnt)):
			# 頂点vにコマが置かれた時の最高スコアを計算し、
			# これまでの最高スコアを上回ったら、これまでの最高スコアを更新する
			procCnt = k+1
			currentCycleSumTmp += C[v]

			cycleLoopCnt = 0
			if 0 < currentCycleTotal:
				cycleLoopCnt = int(( K - procCnt ) // currentCycleItemCnt)

			# print("v=", v, "currentCycleSumTmp=", currentCycleSumTmp, "procCnt, cycleLoopCnt, currentCycleTotal=", procCnt, cycleLoopCnt, currentCycleTotal)
			ans = max( ans, currentCycleSumTmp + cycleLoopCnt * currentCycleTotal )
			v = P[v]


	print(ans) __name__ == "__main__" __name__ "__main__" N,K = map(int,input().split()) N map(int,input().split()) map int input().split() ().split () input split K int(p)-1 for p in input().split() for p in input().split() p input().split() ().split () input split for p in input().split() int(p)-1 int(p) int p 1 P = [ int(p)-1 for p in input().split() ] P [ int(p)-1 for p in input().split() ] C = list(map(int,input().split())) C list(map(int,input().split())) list map(int,input().split()) map int input().split() ().split () input split -1 for _ in range(N) for _ in range(N) _ range(N) range N for _ in range(N) -1 cycleIDs = [ -1 for _ in range(N) ] cycleIDs [ -1 for _ in range(N) ] cycleInfs = [] cycleInfs [] ans = -1e19 ans -1e19 cycleID = 0 cycleID 0 for n in range(N):

		v = n
		currentCycleItemCnt = 0
		currentCycleTotal = 0

		if cycleIDs[v] != -1:
			currentCycleItemCnt, currentCycleTotal = cycleInfs[ cycleIDs[v] ]
			# print(currentCycleItemCnt, currentCycleTotal)
		else:
			while True:
				# 全頂点について、属するサイクルを計算する
				currentCycleItemCnt += 1
				currentCycleTotal += C[v]

				v = P[v]
				if v == n:
					# サイクル発見
					cycleInfs.append( (currentCycleItemCnt, currentCycleTotal) )
					cycleID += 1
					break

				# 一応、一度サイクルを計算した頂点については、
				# その頂点の属するサイクルの情報をメモっておく。。。
				cycleIDs[v] = cycleID

		procCnt = 0
		currentCycleSumTmp = 0

		for k in range(min(K,currentCycleItemCnt)):
			# 頂点vにコマが置かれた時の最高スコアを計算し、
			# これまでの最高スコアを上回ったら、これまでの最高スコアを更新する
			procCnt = k+1
			currentCycleSumTmp += C[v]

			cycleLoopCnt = 0
			if 0 < currentCycleTotal:
				cycleLoopCnt = int(( K - procCnt ) // currentCycleItemCnt)

			# print("v=", v, "currentCycleSumTmp=", currentCycleSumTmp, "procCnt, cycleLoopCnt, currentCycleTotal=", procCnt, cycleLoopCnt, currentCycleTotal)
			ans = max( ans, currentCycleSumTmp + cycleLoopCnt * currentCycleTotal )
			v = P[v]


	 n range(N) range N v = n v n currentCycleItemCnt = 0 currentCycleItemCnt 0 currentCycleTotal = 0 currentCycleTotal 0 if cycleIDs[v] != -1:
			currentCycleItemCnt, currentCycleTotal = cycleInfs[ cycleIDs[v] ]
			# print(currentCycleItemCnt, currentCycleTotal)
		else:
			while True:
				# 全頂点について、属するサイクルを計算する
				currentCycleItemCnt += 1
				currentCycleTotal += C[v]

				v = P[v]
				if v == n:
					# サイクル発見
					cycleInfs.append( (currentCycleItemCnt, currentCycleTotal) )
					cycleID += 1
					break

				# 一応、一度サイクルを計算した頂点については、
				# その頂点の属するサイクルの情報をメモっておく。。。
				cycleIDs[v] = cycleID

		 cycleIDs[v] != -1 cycleIDs[v] cycleIDs v -1 currentCycleItemCnt, currentCycleTotal = cycleInfs[ cycleIDs[v] ] currentCycleItemCnt cycleInfs[ cycleIDs[v] ] cycleInfs cycleIDs[v] cycleIDs v currentCycleTotal while True:
				# 全頂点について、属するサイクルを計算する
				currentCycleItemCnt += 1
				currentCycleTotal += C[v]

				v = P[v]
				if v == n:
					# サイクル発見
					cycleInfs.append( (currentCycleItemCnt, currentCycleTotal) )
					cycleID += 1
					break

				# 一応、一度サイクルを計算した頂点については、
				# その頂点の属するサイクルの情報をメモっておく。。。
				cycleIDs[v] = cycleID

		 True currentCycleItemCnt += 1 currentCycleItemCnt 1 currentCycleTotal += C[v] currentCycleTotal C[v] C v v = P[v] v P[v] P v if v == n:
					# サイクル発見
					cycleInfs.append( (currentCycleItemCnt, currentCycleTotal) )
					cycleID += 1
					break

				# 一応、一度サイクルを計算した頂点については、
				# その頂点の属するサイクルの情報をメモっておく。。。
				 v == n v n cycleInfs.append( (currentCycleItemCnt, currentCycleTotal) ) cycleInfs.append cycleInfs append (currentCycleItemCnt, currentCycleTotal) currentCycleItemCnt currentCycleTotal cycleID += 1 cycleID 1 break cycleIDs[v] = cycleID cycleIDs[v] cycleIDs v cycleID procCnt = 0 procCnt 0 currentCycleSumTmp = 0 currentCycleSumTmp 0 for k in range(min(K,currentCycleItemCnt)):
			# 頂点vにコマが置かれた時の最高スコアを計算し、
			# これまでの最高スコアを上回ったら、これまでの最高スコアを更新する
			procCnt = k+1
			currentCycleSumTmp += C[v]

			cycleLoopCnt = 0
			if 0 < currentCycleTotal:
				cycleLoopCnt = int(( K - procCnt ) // currentCycleItemCnt)

			# print("v=", v, "currentCycleSumTmp=", currentCycleSumTmp, "procCnt, cycleLoopCnt, currentCycleTotal=", procCnt, cycleLoopCnt, currentCycleTotal)
			ans = max( ans, currentCycleSumTmp + cycleLoopCnt * currentCycleTotal )
			v = P[v]


	 k range(min(K,currentCycleItemCnt)) range min(K,currentCycleItemCnt) min K currentCycleItemCnt procCnt = k+1 procCnt k+1 k 1 currentCycleSumTmp += C[v] currentCycleSumTmp C[v] C v cycleLoopCnt = 0 cycleLoopCnt 0 if 0 < currentCycleTotal:
				cycleLoopCnt = int(( K - procCnt ) // currentCycleItemCnt)

			# print("v=", v, "currentCycleSumTmp=", currentCycleSumTmp, "procCnt, cycleLoopCnt, currentCycleTotal=", procCnt, cycleLoopCnt, currentCycleTotal)
			 0 < currentCycleTotal 0 currentCycleTotal cycleLoopCnt = int(( K - procCnt ) // currentCycleItemCnt) cycleLoopCnt int(( K - procCnt ) // currentCycleItemCnt) int ( K - procCnt ) // currentCycleItemCnt K - procCnt K procCnt currentCycleItemCnt ans = max( ans, currentCycleSumTmp + cycleLoopCnt * currentCycleTotal ) ans max( ans, currentCycleSumTmp + cycleLoopCnt * currentCycleTotal ) max ans currentCycleSumTmp + cycleLoopCnt * currentCycleTotal currentCycleSumTmp cycleLoopCnt * currentCycleTotal cycleLoopCnt currentCycleTotal v = P[v] v P[v] P v print(ans) print ans currentCycleTotal += C[v] C[v] currentCycleTotal procCnt = 0 0 procCnt ans = max( ans, currentCycleSumTmp + cycleLoopCnt * currentCycleTotal ) max( ans, currentCycleSumTmp + cycleLoopCnt * currentCycleTotal ) ans v = P[v] P[v] v currentCycleTotal = 0 0 currentCycleTotal currentCycleItemCnt += 1 1 currentCycleItemCnt currentCycleSumTmp += C[v] C[v] currentCycleSumTmp currentCycleSumTmp = 0 0 currentCycleSumTmp cycleID = 0 0 cycleID cycleIDs = [ -1 for _ in range(N) ] [ -1 for _ in range(N) ] cycleIDs ans = -1e19 -1e19 ans cycleInfs = [] [] cycleInfs C = list(map(int,input().split())) list(map(int,input().split())) C currentCycleItemCnt = 0 0 currentCycleItemCnt currentCycleItemCnt, currentCycleTotal = cycleInfs[ cycleIDs[v] ] cycleInfs[ cycleIDs[v] ] currentCycleItemCnt P = [ int(p)-1 for p in input().split() ] [ int(p)-1 for p in input().split() ] P cycleID += 1 1 cycleID v = n n v K = map(int,input().split()) map(int,input().split()) K N,K = map(int,input().split()) map(int,input().split()) N currentCycleTotal = cycleInfs[ cycleIDs[v] ] cycleInfs[ cycleIDs[v] ] currentCycleTotal procCnt = k+1 k+1 procCnt cycleLoopCnt = 0 0 cycleLoopCnt v = P[v] P[v] v cycleLoopCnt = int(( K - procCnt ) // currentCycleItemCnt) int(( K - procCnt ) // currentCycleItemCnt) cycleLoopCnt
# 公式解説を見てからやった
# 複数サイクルでき、1-K回移動可能
# N < 5000?多分、O(N * 2N)くらいで行けそうに見えるが。。。

if __name__ == "__main__":

	N,K = map(int,input().split())
	P = [ int(p)-1 for p in input().split() ]
	C = list(map(int,input().split()))

	# 一度計算したサイクル情報を一応キャッシュしておく。。。
	# あんまり意味なさそう
	cycleIDs = [ -1 for _ in range(N) ]
	cycleInfs = []


	# print(P)

	ans = -1e19
	cycleID = 0

	for n in range(N):

		v = n
		currentCycleItemCnt = 0
		currentCycleTotal = 0

		if cycleIDs[v] != -1:
			currentCycleItemCnt, currentCycleTotal = cycleInfs[ cycleIDs[v] ]
			# print(currentCycleItemCnt, currentCycleTotal)
		else:
			while True:
				# 全頂点について、属するサイクルを計算する
				currentCycleItemCnt += 1
				currentCycleTotal += C[v]

				v = P[v]
				if v == n:
					# サイクル発見
					cycleInfs.append( (currentCycleItemCnt, currentCycleTotal) )
					cycleID += 1
					break

				# 一応、一度サイクルを計算した頂点については、
				# その頂点の属するサイクルの情報をメモっておく。。。
				cycleIDs[v] = cycleID

		procCnt = 0
		currentCycleSumTmp = 0

		for k in range(min(K,currentCycleItemCnt)):
			# 頂点vにコマが置かれた時の最高スコアを計算し、
			# これまでの最高スコアを上回ったら、これまでの最高スコアを更新する
			procCnt = k+1
			currentCycleSumTmp += C[v]

			cycleLoopCnt = 0
			if 0 < currentCycleTotal:
				cycleLoopCnt = int(( K - procCnt ) // currentCycleItemCnt)

			# print("v=", v, "currentCycleSumTmp=", currentCycleSumTmp, "procCnt, cycleLoopCnt, currentCycleTotal=", procCnt, cycleLoopCnt, currentCycleTotal)
			ans = max( ans, currentCycleSumTmp + cycleLoopCnt * currentCycleTotal )
			v = P[v]


	print(ans)
