#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=510;
const int INF=0x7f7f7f7f7f7f7f7f;
const int MAXN=1e9;
int n,a[N],b[N],c[N];
int head[N],tot,tim[N],lst[N],minn=INF;
bool vis[N];
struct Edge{
int next,to;
}e[N<<1];
void adde(int u,int v){
e[++tot].next=head[u];
e[tot].to=v;
head[u]=tot;
}
void dfs(int day){
if(day>=minn) return;
if(day>=n){
for(int i=1;i<=n;i++){
if(c[i]==0){
lst[i]=(a[i]-1)/b[i]+tim[i];
continue;
}
if(c[i]>0){
int l=tim[i],r=MAXN,mid=0,ans=INF;
while(l<=r){
mid=(l+r)>>1;
int num=mid-tim[i]+1;
int now=b[i]*num+(tim[i]+mid)*num/2*c[i];
if(now>=a[i]) ans=min(ans,mid),r=mid-1;
else l=mid+1;
}
lst[i]=ans;
continue;
}
int l=1,r=MAXN,mid=0,point=0;
while(l<=r){
mid=(l+r)>>1;
int now=b[i]+mid*c[i];
if(now<1) r=mid-1;
else point=max(point,mid),l=mid+1;
}
if(tim[i]>point){
lst[i]=a[i]+tim[i]-1;
continue;
}
l=tim[i],r=MAXN,mid=0;
int ans=INF;
while(l<=r){
mid=(l+r)>>1;
if(mid<=point){
int num=mid-tim[i]+1;
int now=num*b[i]+(tim[i]+mid)*num/2*c[i];
if(now>=a[i]) ans=min(ans,mid),r=mid-1;
else l=mid+1;
continue;
}
int num=point-tim[i]+1;
int now=num*b[i]+(tim[i]+point)*num/2*c[i]+mid-point;
if(now>=a[i]) ans=min(ans,mid),r=mid-1;
else l=mid+1;
}
lst[i]=ans;
}
int maxn=0;
for(int i=1;i<=n;i++){
maxn=max(maxn,lst[i]);
}
minn=min(minn,maxn);
return;
}
for(int i=1;i<=n;i++){
if(!vis[i]) continue;
for(int j=head[i];j;j=e[j].next){
int v=e[j].to;
if(vis[v]) continue;
vis[v]=1;
tim[v]=day+1;
dfs(day+1);
vis[v]=0;
}
}
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i];
}
for(int i=1;i<n;i++){
int u,v;cin>>u>>v;
adde(u,v);
adde(v,u);
}
vis[1]=1;
tim[1]=1;
dfs(1);
cout<<minn<<endl;
return 0;
}