只过了Subtask#1,#2、#3、#4、#5等红绿相间,可能反悔部分有问题
#include<bits/stdc++.h>
#include<bits/extc++.h>
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
#define ll long long
#define elif else if
#define sf scanf
#define pf printf
#define int ll
const int MAXN=1e6+5;
vector<int> b,p,u;
int n;
struct node {
int lst,umb,sec;
} ans[MAXN];
signed main() {
freopen("Umb.txt","r",stdin);
freopen("UU.txt","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
b.resize(n);
p.resize(n);
u.resize(n);
for(int i=0; i<n; i++) cin>>b[i];
for(int i=1; i<n; i++) cin>>p[i];
for(int i=1; i<n; i++) cin>>u[i];
auto bb=b;
// auto bb=b,pp=p,uu=u;
//模拟无解
const int Right=b[n-1];
for(int i=1; i<n; i++) {
if(b[i-1]>0) {
//左边可以塞
if(p[i]<=b[i-1]) {
//左边塞得下全部
// cout<<"Left All"<<endl;
b[i-1]-=p[i];
ans[i].lst=p[i];
p[i]=0;
continue;
} else {
//左边装不下全部
// cout<<"Left Some"<<endl;
ans[i].lst=b[i-1];
p[i]-=b[i-1];
b[i-1]=0;
//先全部去买伞
if(u[i]>=p[i]) {
// cout<<"Left All Umb"<<endl;
ans[i].umb=p[i];
u[i]-=p[i];
p[i]=0;
continue;
} else {
// cout<<"Left Some Umb"<<endl;
ans[i].umb=u[i];
p[i]-=u[i];
u[i]=0;
}
//还有剩余 去右边
if(b[i]>=p[i]) {
// cout<<"Right All"<<endl;
// cout<<"B[i]="<<b[i]<<" P[i]="<<p[i]<<endl;
ans[i].sec=p[i];
b[i]-=p[i];
p[i]=0;
} else {
cout<<"NO";
return 0;
}
}
} else {
//左边塞不下了
//先全部去买伞
if(u[i]>=p[i]) {
// cout<<"NOLeft All Umb"<<endl;
ans[i].umb=p[i];
u[i]-=p[i];
p[i]=0;
continue;
} else {
// cout<<"NOLeft Some Umb"<<endl;
ans[i].umb=u[i];
p[i]-=u[i];
u[i]=0;
}
// if(!p[i]) continue;
//还有剩余 去右边
if(b[i]>=p[i]) {
// cout<<"NOLeft Right All"<<endl;
ans[i].sec=p[i];
b[i]-=p[i];
p[i]=0;
} else {
cout<<"NO";
return 0;
}
}
// cout<<ans[i].lst<<' '<<ans[i].umb<<' '<<ans[i].sec<<endl;
}
// cout<<endl;
// for(int i=1;i<n;i++) {
// cout<<ans[i].lst<<' '<<ans[i].umb<<' '<<ans[i].sec<<endl;
// }
cout<<"YES"<<endl;
for(int i=n-1;i>0;i--){
if(b[i]>0){
if(b[i]&&b[i]>ans[i].umb){
b[i-1]+=(b[i]-ans[i].umb);
ans[i].sec+=ans[i].umb;
ans[i].umb=0;
}else{
ans[i].umb-=b[i];
ans[i].sec+=b[i];
b[i]=0;
}
}
}
int bought=0;
for(int i=1;i<n;i++) bought+=ans[i].umb;
cout<<bought<<endl;
for(int i=1;i<n;i++) {
cout<<ans[i].lst<<' '<<ans[i].umb<<' '<<ans[i].sec<<endl;
}
return 0;
}