#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 300005
using namespace std;
typedef long long LL;
struct Node {
Node *ch[2];
int dpt;
LL val;
Node() {}
Node(LL);
void* operator new(size_t) {
static Node *mempool,*C;
if(mempool==C) mempool=(C=new Node[1<<20])+(1<<20);
return C++;
}
}*null=new Node(0),*root[N];
Node :: Node(LL _val):val(_val) {
ch[0]=ch[1]=null;
dpt=null? 0 : -1;
}
Node* Merge(Node* x,Node* y) {
if(x==null) return y;
if(y==null) return x;
if(x->val < y->val) swap(x,y);
x->ch[1]=Merge(x->ch[1],y);
if(x->ch[0]->dpt < x->ch[1]->dpt) swap(x->ch[0],x->ch[1]);
x->dpt=x->ch[1]->dpt+1;
return x;
}
int n,m,pa[N],c[N],deg[N];
LL ans;
int main() {
scanf("%d%d",&n,&m);
n+=m;
for(int i=2;i<=n;i++)
scanf("%d%d",pa+i,c+i), deg[pa[i]]++, ans+=c[i], root[i]=null;
root[1]=null;
for(int i=n;i>1;i--) {
LL L=0,R=0;
if(i<=n-m) {
while(--deg[i]) root[i]=Merge(root[i]->ch[0],root[i]->ch[1]);
R=root[i]->val;
root[i]=Merge(root[i]->ch[0],root[i]->ch[1]);
L=root[i]->val;
root[i]=Merge(root[i]->ch[0],root[i]->ch[1]);
}
root[i]=Merge(root[i],new Node(L+c[i]));
root[i]=Merge(root[i],new Node(R+c[i]));
root[pa[i]]=Merge(root[pa[i]],root[i]);
}
while(deg[1]--) root[1]=Merge(root[1]->ch[0],root[1]->ch[1]);
while(root[1]!=null) {
ans-=root[1]->val;
root[1]=Merge(root[1]->ch[0],root[1]->ch[1]);
}
printf("%lld\n",ans);
return 0;
}