#include<bits/stdc++.h>usingnamespace std;
vector<vector<int>> vv;int m,n;//n 要选的数量 int B[305];int A[305][305];intf(int x){
A[x][1]=B[x];int to;for(int k =0; k<vv[x].size(); k++){// 遍历 x 的所有子节点
to = vv[x][k];// to 是 x 的一个子节点f(to);// 计算 to 节点的 f 数组for(int j = m; j >=1; j--)//倒序枚举,使用 to 节点的 f 数组更新 x 节点的 f 数组for(int i = j -1; i >=1; i--)
A[x][j]=max(A[x][j], A[x][j - i]+ A[to][i]);}}intmain(){
cin>>m>>n;memset(B,0,sizeof(B));memset(A,-1,sizeof(A));
vector<int> v;for(int i=0;i<=m;i++) vv.push_back(v);for(int i=1;i<=m;i++){int a;
cin>>a>>B[i];
vv[a].push_back(i);}//A[x][y]=max(A[x][y],f(x,y-i)+f(vv[x][k],i));f(0);
cout<<A[0][m];}