65pts
#include<bits/stdc++.h>
//#define int __int128
#define int long long
#define N 100005
using namespace std;
int n, sum[N];
int a[N], b[N], c[N], les[N]; //les[i]=j±íê?i×?ííòa?úμújìì????
vector<int>p[N];
int read() {
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9') {
if(ch == '-') f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9') {
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
void write(int x) {
if(x < 0) putchar('-'), x = -x;
if(x > 9) write(x / 10);
putchar('0' + x % 10);
}
int max(int a, int b) {
return a > b ? a : b;
}
bool check2(int x, int day, int m) {
if(day > m) return 0;
if(day == m) {
return max(1, b[x] + m * c[x]) >= a[x];
}
__int128 h = 0;
if(c[x] < 0) {
__int128 num = 0;
num = (__int128)(b[x] - 1) / (-c[x]) + 1;
if(day < num && num <= m) {
h += (__int128)(m - num + 1);
num--;
h += ((__int128)b[x] + (__int128)day * c[x] + b[x] + (__int128)num * c[x]) * ((__int128)num - day + 1) / 2;
}
else if(m < num) {
h += ((__int128)b[x] + (__int128)day * c[x] + b[x] + (__int128)m * c[x]) * ((__int128)m - day + 1) / 2;
}
else {
h += (__int128)(m - day + 1);
}
}
else h += ((__int128)b[x] + day * c[x] + b[x] + m * c[x]) * ((__int128)m - day + 1) / 2;
return h >= a[x];
}
int Get(int x, int m) {
int L = 1, R = n + 1, mid = 0, get = 0;
while(L <= R) {
mid = (L + R) / 2;
if(check2(x, mid, m)) {
get = mid;
L = mid + 1;
}
else R = mid - 1;
}
return get;
}
void dfs(int x, int fa) {
for(int i = 0; i < p[x].size(); i++) {
int y = p[x][i];
if(y == fa) continue;
dfs(y, x);
les[y] = min(les[y], les[x] + 1);
}
}
bool check(int m) {
memset(sum, 0, sizeof(sum));
for(int i = 1; i <= n; i++) {
les[i] = Get(i, m);
sum[les[i]]++;
}
dfs(1, 0);
for(int i = 1; i <= n; i++) {
sum[i] += sum[i - 1];
if(sum[i] > i) return 0;
}
return 1;
}
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 - 1; i++) {
int u, v;
u = read();
v = read();
p[u].push_back(v);
p[v].push_back(u);
}
int L = n, R = 1e9, ans = -1, mid = 0;
while(L <= R) {
mid = (L + R) / 2;
if(check(mid)) {
ans = mid;
R = mid - 1;
}
else L = mid + 1;
}
write(ans);
return 0;
}