#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
long long a[maxn], b[maxn], c[maxn];
vector<int> child[maxn];
int fa[maxn];
int n;
bool culc(int x, int i, int t) {
if (c[i] >= 0) {
return (t - x + 1) * 1.0 / a[i] * (2 * b[i] + x * c[i] + t * c[i]) / 2 >= 1;
} else {
int dt = ceil((b[i] - 1) * 1.0 / -c[i]);
if (dt <= x) return (t - x + 1) >= a[i];
else if(dt <= t) return (t - dt + 1) * 1.0 / a[i] + (dt - x) * 1.0 / a[i] * (b[i] + x * c[i] + b[i] + (dt - 1) * c[i]) / 2.0 >= 0.9999999;
else return (t - x + 1) * 1.0 / a[i] * (2 * b[i] + x * c[i] + t * c[i]) / 2 >= 1;
}
}
pair<int, int> need[maxn];
int ne[maxn];
bool ok[maxn];
int st[maxn];
bool check(int t) {
ok[0] = 1;
for (int i = 1; i <= n; i++) {
need[i].second = i;
int l = 1, r = t;
while (r - l > 1) {
int mid = floor((l + r) / 2.0);
if (culc(mid, i, t)) l = mid;
else r = mid;
}
need[i].first = l;
if (culc(r, i, t)) need[i].first = r;
ok[i] = 0;
ne[i] = need[i].first;
}
sort(need + 1, need + 1 + n);
for (int i = 1, k = 0; i <= n; i++) {
int p = need[i].second;
int sum = 0;
while (!ok[p]) {
st[++sum] = ne[p];
ok[p] = 1;
p = fa[p];
}
while (sum) {
if (st[sum--] < ++k) return false;
}
}
return true;
}
void dfs(int pa, int p) {
fa[p] = pa;
for (int u : child[p]) {
if (u == pa) continue;
dfs(p, u);
}
}
signed main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%lld%d%d", &a[i], &b[i], &c[i]);
for (int i = 1; i < n; i++) {
int u, v;
scanf("%d%d", &u, &v);
child[u].push_back(v);
child[v].push_back(u);
}
dfs(0, 1);
int l = 0, r = 1e9;
while (r - l > 1) {
int mid = (l + r) / 2;
if (check(mid)) r = mid;
else l = mid;
}
int ans = r;
if (check(l)) ans = l;
cout << ans << "\n";
}