#include <bits/stdc++.h>
using namespace std;
#define ff endl
#define lf "\n"
#define fi first
#define se second
#define _ << ' ' <<
#define all(x) begin(x),end(x)
#define rall(x) rbegin(x),rend(x)
#ifdef DEBUG
constexpr bool IS_DEBUG = 1;
#define infor(fmt, ...) do { print(stderr, fmt, ##__VA_ARGS__); } while(0)
#define infof(fmt, ...) do { println(stderr, fmt, ##__VA_ARGS__); } while(0)
#else
constexpr bool IS_DEBUG = 0;
#define infor(fmt, ...)
#define infof(fmt, ...)
#endif
using ll = long long;
using pll = pair<ll, ll>;
using pii = pair<int, int>;
template<typename... Args>
using vec = vector<Args...>;
constexpr int LOG = 20;
constexpr int MOD = 1e9+7;
constexpr int MAXN = 1e5+7;
mt19937 timmy_loves_gambling(73);
constexpr ll INF = 2e18;
struct MonotonicMap {
void prune(void) {
ll mx = -INF;
auto it = m.begin();
for(; it != m.end() && it->fi <= lz; it = m.erase(it)) {
mx = max(mx, it->se);
}
if(mx > -INF) {
m.emplace(lz, mx);
}
it = m.begin();
for(; it != m.end() && it->se + lz < 0; it = m.erase(it));
}
ll get_min(void) {
prune();
return m.empty() ? INF : m.begin()->fi - lz;
}
void apply(ll x) {
lz += x;
prune();
}
void push(ll k, ll v) {
if(v < 0) return;
k += lz, v -= lz;
auto it = m.upper_bound(k);
for(; it != m.end() && it->se <= v; it = m.erase(it));
if(it == m.begin() || prev(it)->se < v) {
m.emplace(k, v);
}
prune();
}
ll lz;
map<ll, ll> m;
};
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int N; cin >> N;
ll S; cin >> S;
vec<int> W(N + 1);
vec<vec<int>> adj(N + 1);
for(int i = 1; i <= N; ++i) {
int x, p; cin >> x >> p;
W[i] = x;
adj[p].emplace_back(i);
}
vec<ll> mn(N + 1, INF);
auto dfs = [&](int v, auto &&dfs) -> MonotonicMap {
MonotonicMap m;
for(auto u: adj[v]) {
auto n = dfs(u, dfs);
n.apply(W[v]);
if(n.m.size() > m.m.size()) {
swap(n, m);
}
for(auto [k, v]: n.m) {
m.push(k - n.lz, v + n.lz);
}
}
if(W[v] >= 0) {
m.push(0, W[v]);
}
mn[v] = m.get_min();
return m;
};
dfs(0, dfs);
ll s = S;
priority_queue<pll, vec<pll>, greater<pll>> q; q.emplace(0, 0);
while(!q.empty()) {
auto [m, v] = q.top(); q.pop();
if(s < m) break;
s += W[v];
for(auto u: adj[v]) {
q.emplace(mn[u], u);
}
}
cout << s - S << lf;
}