#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
#define _int __int128
using namespace std;
const int maxn = 1e5 + 1;
int n, a[maxn], b[maxn], c[maxn];
int f[maxn];
vector<int>g[maxn];
void dfs(int x, int fa) {
f[x] = fa;
for(int i = 0; i < g[x].size(); i++) {
int v = g[x][i];
if(v == fa) continue;
dfs(v, x);
}
return ;
}
bool cal(int l, int r, int i) {
if(c[i] >= 0) return b[i] * (r - l + 1) + (r - l + 1) * (l + r) / 2 * c[i] > a[i];
int I = (1 - b[i]) / c[i];
if(r < I) return b[i] * (r - l + 1) + (r - l + 1) * (l + r) / 2 * c[i] > a[i];
if(l > I) return (r - l + 1) > a[i];
else return b[i] * (I - l + 1) + c[i] * (l + I) * (I - l + 1) / 2 + r - I > a[i];
}
struct node {
int id, num;
bool operator < (const node &t) const {
return num < t.num;
}
} T[maxn];
int tag[maxn], cnt;
void find(int x) {
if(f[x] == 0 || tag[f[x]]) {
tag[x] = ++cnt;
return;
}
find(f[x]);
tag[x] = ++cnt;
return ;
}
bool check(int r) {
cnt = 0;
for(int i = 1; i <= n; i++) {
int dl = 1, dr = n + 1;
while(dl < dr) {
int mid = (dl + dr) / 2;
if(cal(mid, r, i)) dl = mid + 1;
else dr = mid;
}
T[i] = {i, dl};
tag[i] = 0;
}
sort(T + 1, T + 1 + n);
for(int i = 1; i <= n; i++) {
if(tag[T[i].id]) continue;
else {
find(T[i].id);
if(tag[i] > T[i].num) return false;
}
}
return true;
}
int read() {
char x = getchar();
int res = 0, flag = 1;
while('0' > x || '9' < x) {
if(x == '-') flag = -1;
x = getchar();
}
while('0' <= x && x <= '9') {
res = res * 10 + x - '0';
x = getchar();
}
return res * flag;
}
void Write(int x) {
if(x > 9) {
Write(x / 10);
}
putchar(x % 10 + '0');
return ;
}
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; i++) {
int u, v;
u = read();
v = read();
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1, 0);
int l = n + 1, r = 1e9;
while(l < r) {
int mid = (l + r >> 1);
if(check(mid)) {
r = mid;
} else {
l = mid + 1;
}
}
Write(l);
return 0;
}