#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 1e5 + 10;
ll n, a[N], b[N], c[N], lst[N], d[N], mn[N];
ll id, head[N << 1], to[N << 1], nxt[N << 1];
void add(ll u, ll v){
to[++id] = v;
nxt[id] = head[u], head[u] = id;
}
__int128 calc(ll id, ll s, ll t){
__int128 len = t - s + 1;
if(c[id] >= 0)
return (__int128)(b[id] * len) + (__int128)c[id] * (s + t) * len / (__int128)2;
ll limd = (1ll - b[id]) / c[id];
if(t <= limd)
return (__int128)(b[id] * len) + (__int128)c[id] * (s + t) * len / (__int128)2;
if(s > limd)
return (__int128)(t - s + 1);
return (__int128)(b[id] * (limd - s + 1)) + (__int128)c[id] * (s + limd) * (limd - s + 1) / (__int128)2 + (__int128)(t - limd);
}
void dfs(ll u, ll fa){
mn[u] = lst[u];
for(int i=head[u];i;i=nxt[i]){
ll v = to[i];
if(v == fa)
continue;
dfs(v, u);
mn[u] = min(mn[u], mn[v] - 1);
}
}
bool bfs(ll s){
bitset<N> vis;
ll now = 0;
priority_queue<pair<ll, int> > q;
q.push(make_pair(0, s));
while(!q.empty()){
ll u = q.top().second;
q.pop(), ++now;
vis[u] = 1;
if(now > mn[u])
return 0;
for(int i=head[u];i;i=nxt[i]){
int v = to[i];
if(!vis[v])
q.push(make_pair(-mn[v], v));
}
}
return 1;
}
bool check(ll x){
for(int i=1;i<=n;i++){
ll l = 1, r = x;
lst[i] = -1;
while(l <= r){
ll mid = (l + r) >> 1;
if(calc(i, mid, x) >= (__int128)a[i])
lst[i] = mid, l = mid + 1;
else
r = mid - 1;
}
if(lst[i] == -1)
return 0;
}
dfs(1, 1);
return bfs(1);
}
ll read(){
ll n = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9')
n = (n << 1) + (n << 3) + (ch ^ 48), ch = getchar();
return n * f;
}
int main(){
n = read();
for(int i=1;i<=n;++i)
a[i] = read(), b[i] = read(), c[i] = read();
for(int i=1,u,v;i<n;++i){
u = read(), v = read();
add(u, v), add(v, u);
}
ll l = 0, r = 1e9, ans = 0;
while(l <= r){
ll mid = (l + r) >> 1;
if(check(mid))
ans = mid, r = mid - 1;
else
l = mid + 1;
}
printf("%lld\n", ans);
return 0;
}