n, k = map(int, input().split())
P = list(map(lambda x: int(x)-1, input().split()))
C = list(map(int, input().split()))
ans = -10**18
for i in range(n):  # 開始点を全通り
  x = i
  sc = []
  tot = 0
  while True:
    x = P[x]
    sc.append(C[x])
    tot += C[x]
    if x == i: break  # 開始点に戻ってきて循環に入った
  #print(i, sc, tot)
  l = len(sc)
  cum = 0
  for j in range(l):  # 何ステップ進むとよいか
    cum += sc[j]
    if j+1 > k: break  # k=1は最初の1周のみ
    val = cum  # 循環ループ考慮するスコア
    if tot > 0:
      cyc = (k-(j+1)) // l  # 残りステップで循環できる数
      val += tot * cyc
    ans = max(ans, val)
    #print(j, cum, cyc, val)
print(ans) n, k = map(int, input().split()) n map(int, input().split()) map int input().split() ().split () input split k P = list(map(lambda x: int(x)-1, input().split())) P list(map(lambda x: int(x)-1, input().split())) list map(lambda x: int(x)-1, input().split()) map lambda x: int(x)-1 int(x)-1 int(x) int x 1 x input().split() ().split () 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 = -10**18 ans -10**18 -10 18 for i in range(n):  # 開始点を全通り
  x = i
  sc = []
  tot = 0
  while True:
    x = P[x]
    sc.append(C[x])
    tot += C[x]
    if x == i: break  # 開始点に戻ってきて循環に入った
  #print(i, sc, tot)
  l = len(sc)
  cum = 0
  for j in range(l):  # 何ステップ進むとよいか
    cum += sc[j]
    if j+1 > k: break  # k=1は最初の1周のみ
    val = cum  # 循環ループ考慮するスコア
    if tot > 0:
      cyc = (k-(j+1)) // l  # 残りステップで循環できる数
      val += tot * cyc
    ans = max(ans, val)
    #print(j, cum, cyc, val) i range(n) range n x = i x i sc = [] sc [] tot = 0 tot 0 while True:
    x = P[x]
    sc.append(C[x])
    tot += C[x]
    if x == i: break  # 開始点に戻ってきて循環に入った
  #print(i, sc, tot)
   True x = P[x] x P[x] P x sc.append(C[x]) sc.append sc append C[x] C x tot += C[x] tot C[x] C x if x == i: break  # 開始点に戻ってきて循環に入った
  #print(i, sc, tot)
   x == i x i l = len(sc) l len(sc) len sc cum = 0 cum 0 for j in range(l):  # 何ステップ進むとよいか
    cum += sc[j]
    if j+1 > k: break  # k=1は最初の1周のみ
    val = cum  # 循環ループ考慮するスコア
    if tot > 0:
      cyc = (k-(j+1)) // l  # 残りステップで循環できる数
      val += tot * cyc
    ans = max(ans, val)
    #print(j, cum, cyc, val) j range(l) range l cum += sc[j] cum sc[j] sc j if j+1 > k: break  # k=1は最初の1周のみ
     j+1 > k j+1 j 1 k val = cum val cum if tot > 0:
      cyc = (k-(j+1)) // l  # 残りステップで循環できる数
      val += tot * cyc
     tot > 0 tot 0 cyc = (k-(j+1)) // l cyc (k-(j+1)) // l k-(j+1) k j+1 j 1 l val += tot * cyc val tot * cyc tot cyc ans = max(ans, val) ans max(ans, val) max ans val print(ans) print ans C = list(map(int, input().split())) list(map(int, input().split())) C val += tot * cyc tot * cyc val val = cum cum val n, k = map(int, input().split()) map(int, input().split()) n k = map(int, input().split()) map(int, input().split()) k x = P[x] P[x] x l = len(sc) len(sc) l cum += sc[j] sc[j] cum sc = [] [] sc x = i i x tot = 0 0 tot tot += C[x] C[x] tot ans = -10**18 -10**18 ans P = list(map(lambda x: int(x)-1, input().split())) list(map(lambda x: int(x)-1, input().split())) P ans = max(ans, val) max(ans, val) ans cum = 0 0 cum cyc = (k-(j+1)) // l (k-(j+1)) // l cyc
n, k = map(int, input().split())
P = list(map(lambda x: int(x)-1, input().split()))
C = list(map(int, input().split()))
ans = -10**18
for i in range(n):  # 開始点を全通り
  x = i
  sc = []
  tot = 0
  while True:
    x = P[x]
    sc.append(C[x])
    tot += C[x]
    if x == i: break  # 開始点に戻ってきて循環に入った
  #print(i, sc, tot)
  l = len(sc)
  cum = 0
  for j in range(l):  # 何ステップ進むとよいか
    cum += sc[j]
    if j+1 > k: break  # k=1は最初の1周のみ
    val = cum  # 循環ループ考慮するスコア
    if tot > 0:
      cyc = (k-(j+1)) // l  # 残りステップで循環できる数
      val += tot * cyc
    ans = max(ans, val)
    #print(j, cum, cyc, val)
print(ans)