#include<iostream> using namespace std; #define MAXN 103 int room[MAXN][2]; struct Edge{ int to,next; }edge[MAXN*2]; int list[MAXN]; int ind; int col[MAXN]; int dp[MAXN][MAXN]; void init(){memset(list,-1,sizeof(list));ind=0;} void insert(int a,int b){ edge[ind].to=b; edge[ind].next=list[a]; list[a]=ind++; edge[ind].to=a; edge[ind].next=list[b]; list[b]=ind++; } #define _max(a,b) ((a)>(b)?(a):(b)) void dfs(int t,int m){ col[t]=1; int num=room[t][0]/20; if(room[t][0]%20) num++; int i,j; for(i=num;i<=m;i++) dp[t][i]=room[t][1]; int p,v; for(p=list[t];p!=-1;p=edge[p].next){ v=edge[p].to; if(col[v]) continue; dfs(v,m); for(i=m;i>=num;i--) for(j=1;i+j<=m;j++) if(dp[v][j]) dp[t][i+j]=_max(dp[t][i+j],dp[t][i]+dp[v][j]); } } int main() { int n,m; while(scanf("%d%d",&n,&m)){ if(n==-1&&m==-1) break; int i; for(i=1;i<=n;i++) scanf("%d%d",&room[i][0],&room[i][1]); int from,to; init(); for(i=1;i<=n-1;i++){ scanf("%d%d",&from,&to); insert(from,to); } if(m==0) {printf("0/n");continue;} memset(col,0,sizeof(col)); memset(dp,0,sizeof(dp)); dfs(1,m); printf("%d/n",dp[1][m]); } }