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

	# print(P)

	ans = -1e10

	for n in range(N):

		v = n
		currentCycleItemCnt = 0
		currentCycleTotal = 0

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

			v = P[v]
			if v == n:
				# サイクル発見
				break

		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) 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)

	ans = -1e10

	for n in range(N):

		v = n
		currentCycleItemCnt = 0
		currentCycleTotal = 0

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

			v = P[v]
			if v == n:
				# サイクル発見
				break

		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) __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 ans = -1e10 ans -1e10 for n in range(N):

		v = n
		currentCycleItemCnt = 0
		currentCycleTotal = 0

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

			v = P[v]
			if v == n:
				# サイクル発見
				break

		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

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

			v = P[v]
			if v == n:
				# サイクル発見
				break

		 True currentCycleItemCnt += 1 currentCycleItemCnt 1 currentCycleTotal += C[v] currentCycleTotal C[v] C v v = P[v] v P[v] P v if v == n:
				# サイクル発見
				break

		 v == n v n break procCnt = 0 procCnt 0 currentCycleSumTmp = 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

	 True procCnt += 1 procCnt 1 currentCycleSumTmp += C[v] currentCycleSumTmp C[v] C v if K < procCnt:
				break

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

			# print("v=", v, "currentCycleSumTmp=", currentCycleSumTmp, procCnt)
			 procCnt < K and 0 < currentCycleTotal procCnt < K procCnt K 0 < currentCycleTotal 0 currentCycleTotal cycleLoopCnt = ( K - procCnt ) // currentCycleItemCnt cycleLoopCnt ( K - procCnt ) // currentCycleItemCnt K - procCnt K procCnt currentCycleItemCnt tmp = currentCycleSumTmp + cycleLoopCnt * currentCycleTotal tmp currentCycleSumTmp + cycleLoopCnt * currentCycleTotal currentCycleSumTmp cycleLoopCnt * currentCycleTotal cycleLoopCnt currentCycleTotal ans = max( ans, tmp ) ans max( ans, tmp ) max ans tmp v = P[v] v P[v] P v if v == n:
				# サイクル終了
				break

	 v == n v n break print(ans) print ans procCnt += 1 1 procCnt currentCycleTotal = 0 0 currentCycleTotal N,K = map(int,input().split()) map(int,input().split()) N currentCycleItemCnt = 0 0 currentCycleItemCnt procCnt = 0 0 procCnt currentCycleItemCnt += 1 1 currentCycleItemCnt C = list(map(int,input().split())) list(map(int,input().split())) C currentCycleSumTmp = 0 0 currentCycleSumTmp ans = -1e10 -1e10 ans cycleLoopCnt = 0 0 cycleLoopCnt ans = max( ans, tmp ) max( ans, tmp ) ans v = P[v] P[v] v tmp = currentCycleSumTmp + cycleLoopCnt * currentCycleTotal currentCycleSumTmp + cycleLoopCnt * currentCycleTotal tmp v = n n v currentCycleTotal += C[v] C[v] currentCycleTotal P = [ int(p)-1 for p in input().split() ] [ int(p)-1 for p in input().split() ] P v = P[v] P[v] v currentCycleSumTmp += C[v] C[v] currentCycleSumTmp cycleLoopCnt = ( K - procCnt ) // currentCycleItemCnt ( K - procCnt ) // currentCycleItemCnt cycleLoopCnt K = map(int,input().split()) map(int,input().split()) K
# 公式解説を見てからやった
# 複数サイクルでき、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()))

	# print(P)

	ans = -1e10

	for n in range(N):

		v = n
		currentCycleItemCnt = 0
		currentCycleTotal = 0

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

			v = P[v]
			if v == n:
				# サイクル発見
				break

		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)
