#15跟答案差1
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define PII pair<int,int>
#define MP make_pair
#define se second
#define fi first
const int N=1e5+7;
int n,tot,fa[N],ver[N<<1],Next[N<<1],head[N];
ll a[N],b[N],c[N],d[N];
bool vis[N];
PII node[N];
void add(int x,int y){
ver[++tot]=y;Next[tot]=head[x];head[x]=tot;
}
void dfs(int x,int f){
fa[x]=f;
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(y!=f) dfs(y,x);
}
}
int calc(int i,ll t,long double A,long double B,long double C){
if((long double)t*t*A+t*B+C<=0) return (int)t;
long double delta=B*B-4*C*A;
if(delta<0) return -1;
int dl=(int)floor((sqrtl(delta)-B)/(2*A));
if(dl<=(i!=1)) return -1;
return dl;
}
int negcalc(int i,ll t,long double A,long double B,long double C){
if((long double)t*t*A+t*B+C<=0) return (int)t;
long double delta=B*B-4*C*A;
int dl=(int)floor((sqrtl(delta)+B)/(-2*A));
if(dl<=(i!=1)) return -1;
return dl;
}
bool check(ll t){
int dl;
long double ai,bi,ci,di;
FOR(i,1,n){ai=a[i],bi=b[i],ci=c[i],di=d[i];
vis[i]=0;
if(c[i]>0){
dl=calc(i,t,c[i],2*b[i]-c[i],2*ai-(t+1)*(2*bi+ci*t));
if(dl==-1) return 0;
node[i]=MP(dl,i);
}else if(c[i]==0){
dl=t+1-(a[i]+b[i]-1)/b[i];
if(dl<=(i!=1)) return 0;
node[i]=MP(dl,i);
}if(c[i]<0){
if(t-d[i]>=a[i]) dl=t-a[i]+1,node[i]=MP(dl,i);
else if(t<=d[i]){
dl=negcalc(i,t,c[i],2*b[i]-c[i],2*ai-(t+1)*(2*bi+ci*t));
if(dl==-1) return 0;
node[i]=MP(dl,i);
}else{
dl=negcalc(i,t,c[i],2*b[i]-c[i],2*(ai-t+di)-(di+1)*(di*ci+2*bi));
if(dl==-1) return 0;
node[i]=MP(dl,i);
}
}
}
sort(node+1,node+n+1);
int tm=0;
FOR(i,1,n){
int x=node[i].se;
if(!vis[x]){
dl=node[i].fi;
for(;!vis[x];x=fa[x]) vis[x]=1,++tm;
if(tm>dl) return 0;
}
}
return 1;
}
signed main(){
scanf("%d",&n);
FOR(i,1,n){
scanf("%lld%lld%lld",a+i,b+i,c+i);
if(c[i]<0) d[i]=(1-b[i])/c[i];
}
int u,v;
FOR(i,2,n) scanf("%d%d",&u,&v),add(u,v),add(v,u);
dfs(1,0);vis[0]=1;
ll l=n,r=1e9;
while(l<r){
ll mid=l+r>>1;
if(check(mid)) r=mid; else l=mid+1;
}
printf("%lld",l);
return 0;
}