#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read() {
int ret=0,f=1;
char c=getchar();
for(; c<'0'||c>'9'; c=getchar()) if(c=='-') f=-f;
for(; c>='0'&&c<='9'; c=getchar()) ret=ret*10+c-'0';
return ret*f;
}
int N;
const int maxn=2e5+15;
int a[maxn];
int head[maxn],ne[maxn<<1],to[maxn<<1],tot;
struct _cow {
int u,v,cnt;
}ans[maxn<<1];
void add(int u,int v) {
to[tot]=v;
ne[u]=head[u];
head[u]=tot++;
}
int num,cow[maxn],now[maxn],sum[maxn];
void _num(int u,int fa) {
cow[u]=1;
sum[u]=now[u];
int i;
for(i=head[u]; ~i; i=ne[i]) {
if(to[i]==fa) continue;
_num(to[i],u);
cow[u]+=cow[to[i]];
sum[u]+=sum[to[i]];
}
if(u==1) {
num=sum[u]/N;
}
}
int m=0;
void solve(int u,int fa) {
for(int i=head[u]; ~i; i=ne[i]) {
if(to[i]==fa || sum[to[i]]<cow[to[i]]*num) continue;
solve(to[i],u);
if(now[to[i]]>num) {
ans[++m].u=to[i];
ans[m].v=u;
ans[m].cnt=now[to[i]]-num;
sum[to[i]]-=now[to[i]]-num;
now[u]+=now[to[i]]-num;
now[to[i]]=num;
}
}
for(int i=head[u]; ~i; i=ne[i]) {
if(to[i]==fa || sum[to[i]]==cow[to[i]]*num) continue;
ans[++m].u=u;
ans[m].v=to[i];
ans[m].cnt=cow[to[i]]*num-num;
sum[to[i]]=cow[to[i]]*num;
now[u]-=cow[to[i]]*num-sum[to[i]];
now[to[i]]=cow[to[i]]*num;
solve(to[i],u);
}
}
signed main(void) {
N=read();
for(int i=1; i<=N; i++) {
a[i]=read();
}
for(int i=1; i<N; i++) {
int u,v;
u=read();
v=read();
add(u,v);
add(v,u);
}
_num(1,-1);
solve(1,-1);
printf("%d\n",m);
for(int i=1;i<=m;i++) printf("%d %d %lld\n",ans[i].u,ans[i].v,ans[i].cnt);
return 0;
}