rt
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<long long, long long> PII;
const int N = 2e5 + 10;
int n, day;
int h[N], e[N * 2], ne[N * 2], idx;
int d[N], p[N], b[N], c[N], ee[N];
long long a[N];
bool vis[N];
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
void dfs(int x, int fa) {
p[x] = fa;
for (int i = h[x]; ~i; i = ne[i]) {
int y = e[i];
if (y == fa) continue;
dfs(y, x);
}
}
bool plant(int x) {
if (vis[x]) return true;
if (!plant(p[x])) return false;
if (++ day > d[x]) return false;
return vis[x] = true;
}
bool check(int k) {
for (int i = 1; i <= n; i ++ ) {
if (c[i] > 0) {
int l = 1, r = k;
while (l < r) {
int mid = l + r + 1 >> 1;
if ((__int128)(b[i] + c[i] * mid + b[i] + c[i] * k) * (k - mid + 1) / 2 >= a[i]) l = mid;
else r = mid - 1;
}
d[i] = l;
} else if (c[i] == 0) {
d[i] = k - (a[i] + b[i] - 1) / b[i] + 1;
} else {
if (k - ee[i] + 1 >= a[i]) d[i] = k - a[i] + 1;
else {
a[i] -= k - ee[i] + 1;
int l = 1, r = ee[i] - 1;
while (l < r) {
int mid = l + r + 1 >> 1;
if ((__int128)(b[i] + c[i] * mid + b[i] + c[i] * (ee[i] - 1)) * (ee[i] - mid) / 2 >= a[i]) l = mid;
else r = mid - 1;
}
a[i] += k - ee[i] + 1;
d[i] = l;
}
}
}
day = 0;
memset(vis, 0, sizeof vis);
vis[0] = true;
priority_queue<PII, vector<PII>, greater<PII>> heap;
for (int i = 1; i <= n; i ++ ) heap.push({d[i], i});
for (int i = 1; i <= n; i ++ ) {
if (!plant(heap.top().second)) return false;
heap.pop();
}
return true;
}
signed main() {
scanf("%lld", &n);
for (int i = 1; i <= n; i ++ ) {
scanf("%lld%lld%lld", &a[i], &b[i], &c[i]);
if (c[i] >= 0) continue;
int l = 0, r = 1e9;
while (l < r) {
int mid = l + r >> 1;
if (b[i] + mid * c[i] <= 1) r = mid;
else l = mid + 1;
}
ee[i] = l;
}
memset(h, -1, sizeof h);
for (int i = 1; i < n; i ++ ) {
int u, v;
scanf("%lld%lld", &u, &v);
add(u, v), add(v, u);
}
dfs(1, 0);
int l = n, r = 1e9;
while (l < r) {
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
printf("%lld", l);
return 0;
}