#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100005,M=N*2;
int n,num_edge,ansss;
int head[M],ljd[N],f[N],__[N];
__int128 _=1;
bitset<N>vis;
struct Land{
int b,c,ti,tii;
int a;
}d[N];
struct Edge{
int to,net;
}edge[M];
void add_edge(int from,int to){
edge[++num_edge].net=head[from];
edge[num_edge].to=to;
head[from]=num_edge;
}
void dfs1(int now,int fa){
f[now]=fa;
for(int i=head[now];i;i=edge[i].net){
if(edge[i].to==fa) continue;
dfs1(edge[i].to,now);
}
}
bool check3(int stad,int now,int st){
if(_*(d[now].b+d[now].c*st+d[now].b+d[now].c*stad)*(stad-st+1)>=d[now].a*2) return true;
return false;
}
bool check2(int stad,int now,int st){
if(stad<=d[now].ti){
if(_*(d[now].b+d[now].c*st+d[now].b+d[now].c*stad)*(stad-st+1)>=d[now].a*2) return true;
else return false;
}
if(st>d[now].ti){
if((stad-st+1)>=d[now].a) return true;
else return false;
}
else{
if(_*(d[now].b+d[now].c*st+d[now].b+d[now].c*d[now].ti)*(d[now].ti-st+1)+(stad-(d[now].ti+1)+1)*2>=d[now].a) return true;
return false;
}
}
bool check4(int stad,int now){
if(d[now].c*stad+d[now].b<=0) return true;
return false;
}
bool cmp(int x,int y){
return d[x].tii<d[y].tii;
}
bool check1(int stan){
int oo=0;
for(int i=1;i<=n;i++){
int anss=-1;
int l=1,r=stan;
if(d[i].c<0){
while(l<=r){
int mid=(l+r)>>1;
if(check2(stan,i,mid)==true){
anss=mid;
l=mid+1;
}
else r=mid-1;
}
}
else{
while(l<=r){
int mid=(l+r)>>1;
if(check3(stan,i,mid)==true){
anss=mid;
l=mid+1;
}
else r=mid-1;
}
}
d[i].tii=anss;
}
vis.reset();
for(int i=1;i<=n;i++){
__[i]=i;
}
sort(__+1,__+n+1,cmp);
for(int i=1;i<=n;i++){
int now=__[i];
vector<int>vec;
vec.clear();
while(vis[now]==0&&now!=0){
vis[now]=1;
vec.push_back(now);
now=f[now];
}
reverse(vec.begin(),vec.end());
for(int j:vec){
oo++;
if(oo>d[j].tii) return false;
}
}
return true;
}
int read(){
int r=0,f=1;
char c=getchar();
while(!isdigit(c)){
if(c=='-') f=0;
c=getchar();
}
while(isdigit(c)){
r=(r<<1)+(r<<3)+c-48;
c=getchar();
}
return f?r:-r;
}
void write(int x){
if(x>=10) write(x/10);
putchar(x%10^48);
}
signed main(){
n=read();
for(int i=1;i<=n;i++){
d[i].a=read(),d[i].b=read(),d[i].c=read();
if(d[i].c<0){
int l=1,r=1000000000,ansss;
while(l<=r){
int mid=(l+r)>>1;
if(check4(mid,i)==true){
r=mid-1;
ansss=mid;
}
else l=mid+1;
}
d[i].ti=ansss-1;
}
}
for(int i=1;i<n;i++){
int u,v;
u=read();
v=read();
add_edge(u,v);
add_edge(v,u);
}
dfs1(1,0);
int l=1,r=1000000000,ans=114514;
while(l<=r){
int mid=(l+r)>>1;
if(check1(mid)==true){
ans=mid;
r=mid-1;
}
else{ l=mid+1;}
}
write(ans);
return 0;
}