#include<bits/stdc++.h>
#define int long long
#define ld long double
#define pii pair<int, int>
#define vi vector<int>
#define vvi vector<vi>
#define pb push_back
#define fi first
#define se second
#define TII tuple<int, int, int>
#define MT make_tuple
#define mp make_pair
#define ts to_string
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x).size()
#define MIN(x) *min_element(all(x))
#define MAX(x) *max_element(all(x))
#define lb lower_bound
#define ub upper_bound
#pragma GCC optimize("O3", "unroll-loops")
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int N = 3e5 + 5;
struct node{
priority_queue<int> lef;
priority_queue<int, vi, greater<int>> rig;
int mn = 0;
void add(int x) { lef.push(x); rig.push(x); }
int size() { return sz(lef) + sz(rig); }
} a[N];
vi adj[N];
int par[N], c[N];
priority_queue<int, vi, greater<int>> free_empty[N];
int32_t main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
int n, m; cin >> n >> m;
for(int i = 2; i <= n + m; i++) {
cin >> par[i] >> c[i];
adj[par[i]].pb(i);
if(i > n) a[i].add(c[i]);
}
for(int u = n; u >= 1; u--) {
for(int v : adj[u]) {
if(sz(a[u]) < sz(a[v])) swap(a[u], a[v]);
a[u].mn += a[v].mn;
while(!a[v].lef.empty()) {
int cc = a[v].lef.top(); a[v].lef.pop();
if(!a[u].rig.empty() && cc > a[u].rig.top()) {
int lm = a[u].rig.top(); a[u].rig.pop();
a[u].mn += cc - lm;
a[u].lef.push(lm);
a[u].rig.push(cc);
} else a[u].lef.push(cc);
}
while(!a[v].rig.empty()) {
int cc = a[v].rig.top(); a[v].rig.pop();
if(!a[u].lef.empty() && cc < a[u].lef.top()) {
int rm = a[u].lef.top(); a[u].lef.pop();
a[u].mn += rm - cc;
a[u].rig.push(rm);
a[u].lef.push(cc);
} else a[u].rig.push(cc);
}
}
if(u > 1) {
assert(!a[u].lef.empty() && !a[u].rig.empty());
int p = a[u].lef.top(); a[u].lef.pop();
a[u].lef.push(p + c[u]);
int q = a[u].rig.top();
swap(a[u].rig, free_empty[u]);
a[u].rig.push(q + c[u]);
}
}
cout << a[1].mn << '\n';
return 0;
}