#include<bits/stdc++.h>
using namespace std;
long long n,a[200005],nxt[400005],h[400005],to[400005],cnt,sum,b[200005];
bool vis[400005];
struct node{
long long p,g,w;
};
queue<node>q,pq;
void add(long long u,long long v){
to[++cnt]=v;
nxt[cnt]=h[u];
h[u]=cnt;
}
long long dfs(long long u){
vis[u]=1;
for(long long e=h[u];e;e=nxt[e]){
long long v=to[e];
if(vis[v])continue;
long long k=dfs(v);
if(k){
a[u]+=k;
q.push((node){v,u,k});
}
vis[v]=0;
}
return a[u]-sum;
}
int main(){
// freopen("hay.in","r",stdin);
// freopen("hay.out","w",stdout);
cin>>n;
for(long long i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
sum+=a[i];
}
sum/=n;
for(long long i=1;i<n;i++){
long long x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(1);
cout<<q.size()<<"\n";
while(!q.empty()){
if(q.front().w<0){
swap(q.front().p,q.front().g);
q.front().w=-q.front().w;
}
if(a[q.front().p]<0)pq.push((node){q.front().p,q.front().g,q.front().w});
else cout<<q.front().p<<" "<<q.front().g<<" "<<q.front().w<<"\n";
q.pop();
}
while(!pq.empty()){
cout<<pq.front().p<<" "<<pq.front().g<<" "<<pq.front().w<<"\n";
pq.pop();
}
return 0;
}
12分