#include<bits/stdc++.h>
using namespace std;
int n,k,gg,a[305];
std::map<int,int>f[305][305];
std::vector<int>g[305];
int dp(int u,int k,int r){//根节点为u,选k个点,并且无视g[u][0]~g[u][r-1]的子节点
if(f[u][k][r]!=0)//记忆化
return f[u][k][r];
if(g[u].empty()){//这是叶子节点
if(!k)
return 0;
return f[u][k][r]=a[u];
}
if(!k)//不用选
return 0;
if(g[u].size()==1 || r==g[u].size()-1)//当只有一个子树时,选根并转移到该子树上
return f[u][k][r]=a[u]+dp(g[u][r],k-1,0);
int ans=0;
for(int i=0;i<=k;i++){//枚举子树g[u][r]该选多少个
ans=std::max(ans,dp(g[u][r],i,0)+dp(u,k-i,r+1));
}
return f[u][k][r]=ans;
}
int main(){
std::cin>>n>>k;
for(int i=1;i<=n;i++){
std::cin>>gg>>a[i];
g[gg].push_back(i);//存树,gg=0的时候也会如此,代表将多个不相干的树添一个共同根
}
k++;//因为多出来一个0结点作为新的根
std::cout<<dp(0,k,0);
return 0;
}