#include<bits/stdc++.h>
#define int long long
#define mk make_pair
using namespace std;
int n,a[100005],b[100005],c[100005];
int l,r,mid,ans;
int t[100005],s[100005],v[100005];
vector <int> to[100005];
const __int128 turn=1;
inline void dfs(int x,int last){
s[x]=t[x],v[x]=0;
for(int y:to[x]){
if(y==last)continue;
dfs(y,x),s[x]=min(s[x],s[y]-1);
}
return;
}
priority_queue <pair<int,int> > q;
inline bool check(){
for(int i=1;i<=n;i++){
int ll=0,rr=mid;t[i]=-1;
while(ll<=rr){
int mmid=ll+rr>>1,day=(1-b[i])/c[i];
__int128 res=0;
if(c[i]>=0||c[i]<0&&day>=mid){
res=b[i]*turn*(mid-mmid+1)+c[i]*turn*(mid+mmid)*(mid-mmid+1)/2;//这里%%%%%%%%%%%%%
}else if(day<mmid)res=mid-mmid+1;
else res=b[i]*turn*(day-mmid+1)+c[i]*turn*(day+mmid)*(day-mmid+1)/2+mid-day;
if(res>=a[i])t[i]=ll=mmid,ll++;
else rr=mmid-1;
}
if(t[i]<0)return false;
}dfs(1,0);while(q.size())q.pop();q.push(mk(-s[1],1));
int cnt=0;
while(!q.empty()){
int x=q.top().second;q.pop();
v[x]=1,cnt++;
if(cnt>t[x]){
return false;
}
for(int y:to[x]){
if(v[y])continue;
q.push(mk(-s[y],y));
}
}
return true;
}
inline int read(){
register int x(0),t(0);
static char ch=getchar();
while(!isdigit(ch)){t|=(ch=='-');ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return t?-x:x;
}
signed main(){
n=read();
for(int i=1;i<=n;i++){
a[i]=read(),b[i]=read(),c[i]=read();
}
for(int i=1;i<n;i++){
int x=read(),y=read();
to[x].push_back(y),to[y].push_back(x);
}
l=0,r=2e9;
while(l<=r){
mid=l+r>>1;
if(check())r=mid-1,ans=mid;
else l=mid+1;
}
cout<<ans;
// for(int i=1;i<=n;i++){
// int tmp=(b[i]+c[i]-1)*-1,res;
// if(c[i]!=0)tmp/=c[i];
// else{
// if(b[i]>0)tmp=1;else tmp=1e18;
// }
// cout<<tmp<<' ';
// }
return 0;
}