#include<bits/stdc++.h>
#define ll long long
#define ull __int128
using namespace std;
const ll N=1e5+5,M=1e9;
int n,u,v;
int dep[N],vis[N];
ll a[N],b[N],c[N];
ull ans;
vector<int>vec[N];
struct A{
ll last,dep;
}g[N];
bool cmp(A x,A y){
if(x.last==y.last)return x.dep<y.dep;
return x.last<y.last;
}
void bfs(){
queue<int>q;
q.push(1);
while(!q.empty()){
int u=q.front();q.pop();
vis[u]=1;
for(int i=0;i<vec[u].size();i++){
int v=vec[u][i];
if(vis[v])continue;
dep[v]=dep[u]+1;
q.push(v);
}
}
}
inline ull f(int i,ull x){
if(c[i]>0)return b[i]*x+((x+1)*x>>1)*c[i];
ull p=b[i]/(-c[i])-1;
if(b[i]%c[i])p++;
if(x<=p){
return b[i]*x+((x+1)*x>>1)*c[i];
}else{
return b[i]*p+((p+1)*p>>1)*c[i]+x-p;
}
}
inline bool check(ull day){
for(int i=1;i<=n;i++){
g[i].last=0;
if(c[i]==0){
ll x=a[i]/b[i];
if(a[i]*b[i])x++;
g[i].last=day-x+1;
}else{
if(f(i,day)<(ull)a[i])return 0;
ull l=dep[i]+1,r=day,mid;
while(l<=r){
mid=(l+r)>>1;
if(f(i,day)-f(i,mid-1)>=a[i]){
g[i].last=mid,l=mid+1;
}else{
r=mid-1;
}
}
}
if(g[i].last<dep[i]-1)return 0;
}
for(int i=1;i<=n;i++)g[i].dep=dep[i];
sort(g+1,g+1+n,cmp);
for(int i=1;i<=n;i++){
if(g[i].last<i)return 0;
}
return 1;
}
inline ll read(){
ll 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<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
inline void print(ull n){
if(n<0){
putchar('-');
n*=-1;
}
if(n>9){
print(n/10);
}
putchar(n%10+'0');
}
int main(){
freopen("tree4.in","r",stdin);
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++){
u=read();v=read();
vec[u].push_back(v);
vec[v].push_back(u);
}
bfs();
ull l=n,r=1e9,mid;
while(l<=r){
mid=(l+r)>>1;
if(check(mid))ans=mid,r=mid-1;
else l=mid+1;
}
print(ans);
return 0;
}