#include <bits/stdc++.h>
#define int long long
using namespace std;
int val[100005], ans, sz[100005];
vector<pair<int, int>> adj[100005];
bool centroid[100005];
void getsize(int u, int p = 0){
sz[u] = 1;
for(auto [v, cost] : adj[u]){
if(v == p || centroid[v]) continue;
getsize(v, u);
sz[u] += sz[v];
}
}
int findcent(int u, int n, int p = 0){
for(auto [v, cost] : adj[u]){
if(v == p || centroid[v] || sz[v] > n / 2)
return findcent(v, n, u);
}
return u;
}
vector<int> ajung;
void query(int u, int curr, int min_necesar, int p = 0){
int l = -1, r = ajung.size() - 1;
while(r - l > 1){
int mid = l + r >> 1;
if(ajung[mid] >= min_necesar){
r = mid;
}
else
l = mid;
}
if(r == 0 && ajung[0] < min_necesar) r--;
ans += r + 1;
curr += val[u];
for(auto [v, cost] : adj[u]){
if(centroid[v] || v == p)
continue;
query(v, curr - cost, max(min_necesar, cost - curr));
}
}
void update(int u, int trebuie, int cu_cat, int p = 0){
if(trebuie == 0){
ajung.push_back(cu_cat);
}
for(auto )
}
void bagacentroid_si_da_pray(int u = 1){
getsize(u);
int cent = findcent(u, sz[u]);
ajung.clear();
ajung.push_back(val[cent]);
centroid[cent] = 1;
for(auto [v, cost] : adj[cent]){
query(v, val[cent] - cost, max(val[cent] - cost, 0LL));
update(v, max(0LL, cost - val[v]), val[cent] + val[v] - cost);
}
}
signed main(){
int n;
cin >> n;
for(int i = 1; i <= n; i++) cin >> v[i];
for(int i = 1; i < n; i++){
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
bagacentroid_si_da_pray();
return 0;
}