#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e4+6;
const int inf=1e18;
int ls(int p){return p<<1;}
int rs(int p){return p<<1|1;}
int n,k,d[N],c[N],s[N],w[N],st[N],ed[N],f[N],tree[N<<2],tag[N<<2];
struct node{int to,nxt;}e[N];
int head[N],cnt;
void add(int u,int v){
e[++cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
void pushup(int p){tree[p]=min(tree[ls(p)],tree[rs(p)]);}
void build(int p,int pl,int pr){
tree[p]=0,tag[p]=0;
if(pl==pr){
tree[p]=f[pl];
return;
}
int mid=(pl+pr)>>1;
build(ls(p),pl,mid);
build(rs(p),mid+1,pr);
pushup(p);
cout<<tree[p]<<" ";
}
void addtag(int p,int d){
tree[p]+=d;
tag[p]+=d;
}
void pushdown(int p){
if(tag[p]){
addtag(ls(p),tag[p]);
addtag(rs(p),tag[p]);
tag[p]=0;
}
}
void update(int p,int pl,int pr,int L,int R,int d){
if(pl>=L&&pr<=R){
addtag(p,d);
return;
}
pushdown(p);
int mid=(pl+pr)>>1;
cout<<mid<<" ";
if(L<=mid)update(ls(p),pl,mid,L,R,d);
if(R>mid)update(rs(p),mid+1,pr,L,R,d);
pushup(p);
}
int query(int p,int pl,int pr,int L,int R){
if(pl>=L&&pr<=R){
return tree[p];
}
pushdown(p);
int mid=(pl+pr)>>1,res=inf;
if(L<=mid)res=min(res,query(ls(p),pl,mid,L,R));
if(R>mid)res=min(res,query(rs(p),mid+1,pr,L,R));
return res;
}
signed main(){
cin>>n>>k;
for(int i=2;i<=n;i++)cin>>d[i];
for(int i=1;i<=n;i++)cin>>c[i];
for(int i=1;i<=n;i++)cin>>s[i];
for(int i=1;i<=n;i++)cin>>w[i];
n++,k++;
d[n]=inf,w[n]=inf;
for(int i=1;i<=n;i++){
st[i]=lower_bound(d+1,d+1+n,d[i]-s[i])-d;
ed[i]=upper_bound(d+1,d+1+n,d[i]+s[i])-d-1;
add(ed[i],i);
//cout<<st[i]<<" "<<ed[i]<<endl;
}
int now=0;
for(int i=1;i<=n;i++){
f[i]=now+c[i];
for(int j=head[i];j;j=e[j].nxt){
int v=e[j].to;
now+=w[v];
}
//cout<<"*"<<f[i]<<endl;
}
int ans=inf;
for(int j=2;j<=k;j++){
build(1,1,n);
cout<<endl<<j<<endl;
for(int i=1;i<=n;i++){
f[i]=query(1,1,n,1,i-1)+c[i];
for(int k=head[i];k;k=e[k].nxt){
int v=e[k].to;
update(1,1,n,1,st[v]-1,w[v]);
}
//cout<<f[i]<<" ";
}
ans=min(f[n],ans);
}
cout<<ans;
return 0;
}