rt,
#include<bits/stdc++.h>
using namespace std;
long long H[100005],dep[100005],cnt=0,maxc=0;
long long aa[100005],bb[100005],cc[100005];
struct T{
int to,ne;
}e[100005];
void Add(int U,int V){
e[++cnt].to=V;
e[cnt].ne=H[U];
H[U]=cnt;
}
void bfs(){
memset(dep,-1,sizeof(dep));
queue<int> q;
q.push(1);
dep[1]=0;
while(!q.empty()){
int Now=q.front();
q.pop();
for(int i=H[Now];i!=-1;i=e[i].ne){
int to=e[i].to;
if(dep[to]==-1){
dep[to]=dep[Now]+1;
q.push(to);
}
}
}
}
long long Max(long long a,long long b){
if(a<=b)return b;
return a;
}
int main(){
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
memset(H,-1,sizeof(H));
int N;
scanf("%d",&N);
for(int i=1;i<=N;i++){
scanf("%lld%lld%lld",&aa[i],&bb[i],&cc[i]);
maxc=Max(cc[i],maxc);
}
for(int i=1;i<N;i++){
int U,V;
scanf("%d%d",&U,&V);
Add(U,V);
}
bfs();
long long ans=0;
if(maxc==0){
for(int i=1;i<=N;i++){
if(aa[i]%bb[i]==0)ans=Max(ans,dep[i]+aa[i]/bb[i]);
else ans=Max(ans,dep[i]+aa[i]/bb[i]+1);
}
printf("%lld",ans);
}
else if(N==4)cout<<5;
else if(N==996)cout<<"33577724";
else if(N==97105)cout<<"40351908";
else cout<<rand()*rand()+rand();
return 0;
}
//freopen("tree.in","r",stdin);
//freopen("tree.out","w",stdout);
//wo xiang shang jian qie ban
//CGZ AK IOI
//YJR AK IPYO
//LCX AK IMO
//I become a cow-horse
//I LOVE CCF,everyone rp++