#yukicoder3283 Labyrinth and Friends def main(): #入力受取 input = __import__('sys').stdin.readline N, X = map(int, input().split()) P = [0] * N Gin = [0] * N C, S = [0] * N, [0] * N for now, v in enumerate(input().split(), start = 1): nxt = int(v) - 1 P[now] = nxt Gin[nxt] += 1 C[now], S[now] = map(int, input().split()) #DP[now][s]: 頂点nowと連続する子を解放した上で、ステータスをちょうどsとする最小コスト Ssum = S[:] Q = [now for now, Gin_now in enumerate(Gin) if Gin_now == 0] for now in Q: if now == 0: break nxt = P[now] Gin[nxt] -= 1 if Gin[nxt] == 0: Q.append(nxt) Ssum[nxt] += Ssum[now] DP = [[0x7FFFFFFFFFFFFFFF] * (Ssum_now + 1) for Ssum_now in Ssum] for now, S_now in enumerate(S): Ssum[now] = S_now DP[now][S[now]] = C[now] #二乗の木DP インラインに更新する for now in Q: if now == 0: break nxt = P[now] dp_now, dp_nxt = DP[now], DP[nxt] for s in range(Ssum[nxt], -1, -1): if (dp_nxt_s := dp_nxt[s]) == 0x7FFFFFFFFFFFFFFF: continue for s_t, dp_now_t in enumerate(dp_now, start = s): if dp_now_t != 0x7FFFFFFFFFFFFFFF and dp_nxt[s_t] > dp_nxt_s + dp_now_t: dp_nxt[s_t] = dp_nxt_s + dp_now_t Ssum[nxt] += Ssum[now] #答えを出力 print(min(DP[0][X:])) main()