树形dp
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <math.h>
using namespace std;
#define sf scanf
#define pf printf
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
#define dbg(x) cerr << "Line:" << __LINE__ << " : " << #x << " = " << (x) << endl
#define nMax 1000
#define ll long long
int n,m;
int bugs[nMax],dp[110][110],val[nMax];
int first[nMax],nxt[nMax],to[nMax],e;
int vis[nMax];
void addadge(int u,int v) {
to[e]=v;nxt[e]=first[u];first[u]=e;e++;
to[e]=u;nxt[e]=first[v];first[v]=e;e++;
}
int inline max(int a,int b) { return a > b ? a : b ; }
void dfs(int u) {
rep(i,m+1) if(i >= bugs[u]) dp[u][i]=val[u]; else dp[u][i]=0;
vis[u] = 1;
for(int i=first[u],v;i!=-1;i=nxt[i])if(!vis[v=to[i]]) {
dfs(v);
for(int j=m;j>=bugs[u];j--) {
for(int k=1;k<=j-bugs[u];k++){
dp[u][j] = max(dp[u][j],dp[v][k] + dp[u][j-k]);
}
}
}
}
void work() {
rep(i,n) {
bugs[i] = bugs[i]/20 + (bugs[i]%20==0?0:1);
}
memset(vis,0,sizeof(vis));
dfs(0);
int ans = 0;
for(int i=0;i<=m;i++) ans = max(ans,dp[0][i]);
if(m==0) ans = 0;
pf("%d\n",ans);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
while(sf("%d%d",&n,&m)) {
if( n==-1 && m==-1 ) break;
e = 0;
memset(first,-1,sizeof(first));
rep(i,n) sf("%d%d",&bugs[i],&val[i]);
// dbg(val[0]);
int u,v;
rep(i,n-1) {
sf("%d%d",&u,&v);
addadge(u-1,v-1);
}
work();
}
return 0;
}