#include<bits/stdc++.h>
#define int long long
#define int128 __int128
using namespace std;
const int Max=5e5+5;
int n;
struct area{
int128 a;
int b,c;
}g[Max];
struct edge{
int to,next;
}p[Max];
int head[Max],idx=0;
void add(int u,int v)
{
p[++idx].next=head[u];
head[u]=idx;
p[idx].to=v;
}
int128 read()
{
int w=0,minue=1;
char c=getchar();
while(c<'0' or '9'<c)
{
if(c=='-')
minue=-1;
c=getchar();
}
while('0'<=c and c<='9')
{
w*=10;
w=w+(int128)(c-'0');
c=getchar();
}
return w*minue;
}
int need[Max];
int calc(int now,int m)
{
int l=0,r=m;
int128 t;
if(g[now].c<0)
t=(1-g[now].b)/g[now].c;
while(l<r)
{
int128 mid=(l+r+1)>>1;
int128 s=0;
if(g[now].c>=0)
{
s=((g[now].b+(int128)g[now].c*mid)+((int128)g[now].c*m+g[now].b))*(m-mid+1)/2;
}
else
{
if(mid<t and t<m)
{
s=(m-t);
s+=((g[now].b+(int128)g[now].c*mid)+((int128)g[now].c*(t-1)+g[now].b))*(t-mid)/2;
}
else if(mid<t and m<t)
{
s+=((g[now].b+(int128)g[now].c*mid)+((int128)g[now].c*m+g[now].b))*(m-mid+1)/2;
}
else
{
s=(m-mid);
}
}
if(s>=g[now].a)
{
l=mid;
}
else
{
r=mid-1;
}
}
return l;
}
bool vis[Max];
int fa[Max];
void dfs(int now,int from)
{
fa[now]=from;
for(int i=head[now];p[i].to;i=p[i].next)
{
if(p[i].to==from)
continue;
dfs(p[i].to,now);
}
}
int paint(int now)
{
vis[now]=true;
if(vis[fa[now]] or now==1)
{
return 1;
}
return paint(fa[now]);
}
bool check(int now)
{
priority_queue<pair<int,int> > in;
int t=0;
for(int i=1;i<=n;i++)
{
need[i]=calc(i,now);
vis[i]=false;
in.push(make_pair(-need[i],i));
}
while(!in.empty())
{
int x=in.top().second;
in.pop();
t+=paint(x);
if(t>need[x])
return false;
}
return true;
}
signed main()
{
int l=1,r=1e9+5;
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
g[i].a=read();
g[i].b=read();
g[i].c=read();
}
int x,y;
for(int i=1;i<n;i++)
{
scanf("%lld%lld",&x,&y);
add(x,y);
add(y,x);
}
dfs(1,1);
while(l<r)
{
int mid=(l+r)>>1;
if(check(mid))
r=mid;
else
l=mid+1;
}
printf("%lld",l);
}