全wa
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10;
struct Edge{int to,nex,val;}edge[N],x[N];
int Settt[N],head[N],f[N],flag[N],dep[N],st[N][40],St[N][40],q[N],b[N],tot,lg[N],ans,n,m,Q,gold;
bool cmp(Edge x,Edge y){return x.val>y.val;}
inline void ins(int x,int y,int val){edge[tot].to=y;edge[tot].nex=head[x];edge[tot].val=val;head[x]=tot++;}
inline int finds(int x){return (~f[x]?x:f[x]=finds(f[x]));}
inline void check(int x,int y,int val){
int fx=finds(x),fy=finds(y);
if (fx!=fy) f[fx]=fy,ins(fx,fy,val),ins(fy,fx,val);
}
void ST(int x,int fa){
if (flag[x]) return;
flag[x]=true;dep[x]=dep[fa]+1;st[0][x]=fa;
for (int i=1;i<=lg[dep[x]]+1;i++) st[i][x]=st[i-1][st[i-1][x]],St[i][x]=min(St[i-1][x],St[i-1][st[i-1][x]]);
for (int i=head[x];~i;i=edge[i].nex){int u=edge[i].to;if (u!=fa) St[0][u]=edge[i].val,ST(u,x);}
}
int lca(int x,int y){
int mi=2e9;
if (dep[x]<dep[y]) swap(x,y);
for (int i=lg[dep[x]]+1;i>=0;i--) if (dep[st[i][x]]>=dep[y]) mi=min(mi,St[i][x]),x=st[i][x];
if (x==y) return mi;
for (int i=lg[dep[x]]+1;i>=0;i--) if (st[i][x]!=st[i][y]) mi=min(mi,min(St[i][x],St[i][y])),x=st[i][x],y=st[i][y];
return min(mi,St[0][x]);
}
signed main(){
scanf("%d%d%d",&n,&m,&Q);
memset(f,-1,sizeof(f));memset(head,-1,sizeof(head));memset(St,0x3f,sizeof(St));
for (int i=1;i<=n;i++) scanf("%d",&Settt[i]);
for (int i=1;i<=n;i++) scanf("%d",&b[i]);
for (int i=1;i<=m;i++) scanf("%d%d%d",&x[i].to,&x[i].nex,&x[i].val);
for (int i=1;i<=Q;i++) scanf("%d",&q[i]);
for (int i=1;i<Q;i++) check(q[i],q[i+1],1e10);
sort(x+1,x+m+1,cmp);
for (int i=1;i<=m;i++) check(x[i].to,x[i].nex,x[i].val);
for (int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;
ST(1,0);if (b[Settt[1]]>0) gold=b[Settt[1]];else printf("0\n");
for (int i=2;i<=n;i++){
gold=min(gold,lca(Settt[i-1],Settt[i]));
if (b[Settt[i]]>0) gold+=b[Settt[i]];
else printf("%d\n",min(-b[Settt[i]],gold)),gold-=min(-b[Settt[i]],gold);
}
return 0;
}