#include<bits/stdc++.h>
using namespace std;
int n,m,k,u;
int f[10005][2];
int val[10005];
struct node{
int leftson,rightson,value;
}tree[10005];
int cnt=0;
int dfs(int u,int k){
if(f[u][k]){
return f[u][k];
}
for(int i=0;i<k;i++){
f[u][k]=max(f[u][k],dfs(tree[u].leftson,i)+val[u]+dfs(tree[u].rightson,k-i-1));
}
f[u][k]=max(f[u][k],dfs(tree[u].rightson,k));
return f[u][k];
}
int main(){
scanf("%d%d",&n,&m);
int parent,val;
for(int i=1;i<=n;i++){
scanf("%d%d",&parent,&val);
if(tree[i].leftson){
tree[i].rightson=tree[parent].leftson;
}
tree[parent].leftson=i;
}
dfs(tree[0].leftson,m);
printf("%d",f[0][m]);
return 0;
}