tree=record
l,r:longint;
end;
var f:array[0..1024,0..109]of longint;
t:array[1..1024]of tree;
w,v:array[1..1024]of longint;
i,n,m,x:longint;
procedure dp(i,j:longint);
var k:longint;
function max(x,y:longint):longint;
begin
if x>y then
exit(x) else exit(y);
end;
begin
if i=0 then exit;
if f[i,j]<>0 then exit;
if (j>=v[i])and(w[i]>0) then
begin
dp(t[i].r,j-v[i]);
f[i,j]:=f[t[i].r,j-v[i]]+w[i];
end;
for k:=0 to j do
begin
dp(t[i].l,k);
dp(t[i].r,j-k);
f[i,j]:=max(f[i,j],f[t[i].l,k]+f[t[i].r,j-k]);
end;
end;
begin
readln(n,m);
for i:=2 to n do
begin
read(x);
if t[x].l=0 then
t[x].l:=i else
begin
x:=t[x].l;
while t[x].r<>0 do
x:=t[x].r;
t[x].r:=i;
end;
end;
for i:=1 to n do
read(v[i]);
for i:=1 to n do
read(w[i]);
dp(1,m);
writeln(f[1,m]);
end.