### BUGGY CODE ###

import itertools
import numpy as np

if __name__ == "__main__":

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

	# print(P)
	# 一度計算したサイクル情報をキャッシュしておくための配列
	cycleIDs = np.full( N, -1, np.int64 )
	cycleInfs = []

	ans = -10 ** 9
	cycleID = 0

	for n in range(N):

		v = n

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

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

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

	for cycleID in cycleIDs:

		currentCycleItemCnt = cycleInfs[cycleID][0]
		currentCycleCosts = np.array( cycleInfs[cycleID][1] )
		currentCycleTotalScore = np.sum(currentCycleCosts)

		# ループを含めない最大の処理回数
		procCnt = K % currentCycleItemCnt
		# ただし、割り切れる場合も、1サイクル分は処理するものとする
		# (1回以上はやらなければならないのを考慮？)
		if procCnt == 0:
			procCnt = currentCycleItemCnt
		# procCnt = min( K, procCnt )

		# サイクル内でループしてスコアを稼ぐ場合の考慮
		cycleLoopCnt = 0
		if currentCycleTotalScore > 0:
			# その時、ループが発生した方がスコアが高くなる場合
			# ループ回数を計算
			cycleLoopCnt =  ( K - procCnt ) // currentCycleItemCnt
			# print("K - procCnt=", K - procCnt, "currentCycleItemCnt=", currentCycleItemCnt)
			# print("cycleLoopCnt=", cycleLoopCnt)


		# このサイクル内での最大スコア
		currentCycleMaxScore = -10 ** 9

		# このサイクルに属する全頂点分をまとめて計算する
		# まず、ループが発生しない分まで計算

		for i in range(currentCycleItemCnt):
			# 累積和
			acc = list(itertools.accumulate( np.roll( currentCycleCosts, i )[:procCnt] ) )

			# print(i, acc)#[:procCnt])
			currentCycleMaxScore = max( currentCycleMaxScore, max( acc ) )
		# print("currentCycleMaxScore=",currentCycleMaxScore)


		currentCycleMaxScore += cycleLoopCnt * currentCycleTotalScore
		# print("v=", v, "currentCycleItemCnt=", currentCycleItemCnt, "procCnt, cycleLoopCnt, currentCycleMaxScore,currentCycleTotalScore=", procCnt, cycleLoopCnt, currentCycleMaxScore,currentCycleTotalScore)

		ans = max( ans, currentCycleMaxScore )

	print(ans)


### FIXED CODE ###

# 公式解説を見てからやった
# 複数サイクルでき、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 = -1e10
	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

		while True:

			# 頂点vにコマが置かれた時の最高スコアを計算し、
			# これまでの最高スコアを上回ったら、これまでの最高スコアを更新する
			procCnt += 1
			currentCycleSumTmp += C[v]
			if K < procCnt:
				break

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

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

			v = P[v]
			if v == n:
				# サイクル終了
				break

	print(ans)