#include<bits/stdc++.h>
using namespace std;
int read(){
int x=0;bool flag=true;
char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') flag=false,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
if(flag) return x;
else return -x;
}
#define N 100005
#define ll unsigned long long
int n,b[N],c[N],fa[N],latest[N],idx[N];
ll a[N];bool vis[N];
int nxt[N<<1],head[N],to[N<<1],top=0;
ll countr(int x,ll l,ll r){
if(c[x]==0) return b[x]*(r-l+1);
if(c[x]>0) return b[x]*(r-l+1)+c[x]*(r+l)*(r-l+1)/2;
ll imax=(1-b[x])/c[x];
if(imax<l) return r-l+1;
if(imax>r) return b[x]*(r-l+1)+c[x]*(r+l)*(r-l+1)/2;
return b[x]*(imax-l+1)+c[x]*(imax+l)*(imax-l+1)/2+r-imax;
}
void addedge(int a,int b){
to[++top]=b;
nxt[top]=head[a];
head[a]=top;
}
void dfs(int x){
for(int i=head[x];i;i=nxt[i]){
if(to[i]==fa[x]) continue;
fa[to[i]]=x;
dfs(to[i]);
}
return ;
}
bool cmp(int a,int b){
return latest[a]<latest[b];
}
bool checktr(int lastt){
for(int i=1;i<=n;i++){
int l=1,r=lastt,mid;
while(l<r){
mid=(l+r+1)/2;
if(countr(i,mid,lastt)>=a[i]) l=mid;
else r=mid-1;
}
latest[i]=l;
idx[i-1]=i;
vis[i]=false;
}
vis[1]=true;
sort(idx+1,idx+n,cmp);
int ord=1,j;
for(int i=1;i<=n-1;i++){
j=idx[i];
if(vis[j]) continue;
while(!vis[j]) ord++,vis[j]=true,j=fa[j];
if(ord>latest[idx[i]]) return false;
}
return true;
}
int main(){
n=read();
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
b[i]=read();c[i]=read();
}
int u,v;
for(int i=1;i<=n-1;i++){
u=read();v=read();
addedge(u,v);
addedge(v,u);
}
dfs(1);
int l=1,r=1e9,mid=(l+r)/2;
while(l<r){
if(checktr(mid)) r=mid;
else l=mid+1;
mid=(l+r)/2;
}
printf("%d",l);
return 0;
}