#include<iostream>
#define D if(debug)
using namespace std;
const int maxn=316;
const bool debug=false;
struct Node
{
int son[maxn];
int num;
int sc;
Node() {num=0;sc=-114514;}
inline void addson(int i) {son[num++]=i;return;}
};
Node node[maxn];
int F[maxn][maxn][maxn];
bool booked[maxn];
int f(int root,int Num)
{
if(Num==0) return node[root].sc;
int Max=node[root].sc;
int qwqwq=-1; int qaqaq=-2;
for(register int k=0;k<Num;k++)
for(register int v=0;v<node[root].num;v++)
{
if(booked[node[root].son[v]]) continue;
booked[node[root].son[v]]=true;
F[root][Num-k-1][node[root].son[v]]=f(root,Num-k-1);
F[node[root].son[v]][k][node[root].son[v]]=f(node[root].son[v],k);
int val=F[root][Num-k-1][node[root].son[v]]+F[node[root].son[v]][k][node[root].son[v]];
if(val>Max) { Max=val; D qwqwq=node[root].son[v]; D qaqaq=k; }
booked[node[root].son[v]]=false;
}
D cout<<qwqwq<<" "<<qaqaq<<endl;
return Max;
}
int main()
{
int n,m;
cin>>n>>m;
int buf;
for(register int i=1;i<=n;i++)
{
cin>>buf>>node[i].sc;
node[buf].addson(i);
}
node[0].sc=0;
cout<<f(0,m)<<endl;
}