#include <bits/stdc++.h>
#define pb emplace_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int, int> pi;
bool Mbe;
const int N = 1e5 + 100;
const int T = (1 << 20) + 10;
int n, a[N], b[N], c[N], t[N];
vector<int> g[N];
int calc(int x, int i) {
if (!x) return 0;
if (!c[i]) return max(1ll, b[i]) * x;
else if (c[i] > 0) return x * b[i] + x * (x + 1) / 2 * c[i];
else {
int tp = 1. * (1 - b[i]) / c[i];
if (x <= tp) return (2 * b[i] + (x + 1) * c[i]) * x / 2;
else return (2 * b[i] + (tp + 1) * c[i]) * tp / 2 + x - tp;
}
}
bool chk3(int x) {
for (int i = 1; i <= n; i++) {
int l = 1, r = x; t[i] = 0;
while (l <= r) {
int md = (l + r) >> 1;
if (calc(x, i) - calc(md - 1, i) >= a[i]) t[i] = md, l = md + 1;
else r = md - 1;
}
t[i] = min(t[i], n);
}
if (t[1] < 1) return 0;
sort(t + 2, t + n + 1);
for (int i = 2; i <= n; i++)
if (t[i] < i) return 0;
return 1;
}
void solve() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i] >> b[i] >> c[i];
int fl = 1;
for (int i = 1, u, v; i <= n - 1; i++) {
cin >> u >> v, g[u].pb(v), g[v].pb(u);
if (u != i || v != i + 1) fl = 0;
}
if (fl) {
int ans = 0;
for (int i = 1; i <= n; i++) {
int l = i, r = 1e9, res = 1e9;
while (l <= r) {
int md = (l + r) >> 1;
if (calc(md, i) - calc(i - 1, i) >= a[i]) res = md, r = md - 1;
else l = md + 1;
}
ans = max(ans, res);
}
cout << ans << '\n';
return;
}
int l = 1, r = 1e9, res = 1e9;
while (l <= r) {
int md = (l + r) >> 1, flg;
flg = chk3(md);
if (flg) res = md, r = md - 1;
else l = md + 1;
}
cout << res << '\n';
}
bool Med;
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cerr << (&Mbe - &Med) / 1024 / 1024 << " MB\n";
#ifdef FILE
freopen("tree.in", "r", stdin);
freopen("tree.out", "w", stdout);
#endif
int T = 1;
while (T--) solve();
cerr << 1. * clock() / CLOCKS_PER_SEC << " ms\n";
return 0;
}