1 #include <cstdio>
2 #include <iostream>
3 #include <cstring>
4 #include <algorithm>
5 using namespace std;
6 const int N=1e5+10,M=1e6+10;
7 int n,m,num,tot,K,Ans,cnt[2],sum[N],head[2][N],f[N],a[N],Num[N],bel[N],ans[N],fa[N],dfn[N],low[N],p[N];
8 bool b[N],vis[N];
9 struct edge { int x,y; }e[2][M];
10 void insert(int p,int x,int y) { e[p][++cnt[p]].x=y,e[p][cnt[p]].y=head[p][x],head[p][x]=cnt[p]; }
11 int getfather(int x) { return fa[x]==x?x:fa[x]=getfather(fa[x]); }
12 void Tarjan(int x)
13 {
14 dfn[x]=low[x]=++dfn[0],p[++tot]=x,vis[x]=1;
15 for (int i=head[0][x];i;i=e[0][i].y)
16 if (!bel[e[0][i].x])
17 {
18 if (vis[e[0][i].x]) low[x]=min(low[x],dfn[e[0][i].x]);
19 else Tarjan(e[0][i].x),low[x]=min(low[x],low[e[0][i].x]);
20 }
21 if (dfn[x]==low[x])
22 {
23 num++; int v;
24 do
25 {
26 v=p[tot--],bel[v]=num,sum[num]+=a[v],vis[v]=0;
27 }while(v!=x);
28 }
29 }
30 void work(int x)
31 {
32 b[x]=1,f[x]+=sum[x];
33 for (int i=head[1][x];i;i=e[1][i].y)
34 {
35 getfather(x),getfather(e[1][i].x);
36 fa[fa[x]]=fa[e[1][i].x],Num[e[1][i].x]--,f[e[1][i].x]=max(f[x],f[e[1][i].x]);
37 if (!Num[e[1][i].x]) work(e[1][i].x);
38 }
39 }
40 int main()
41 {
42 freopen("azeroth.in","r",stdin),freopen("azeroth.out","w",stdout),scanf("%d%d",&n,&m);
43 for (int i=1,x,y;i<=m;i++) { scanf("%d%d",&x,&y); if (x==y) continue; insert(0,x,y); }
44 for (int i=1;i<=n;i++) scanf("%d",&a[i]);
45 scanf("%d",&K);
46 for (int i=1;i<=n;i++) if (!bel[i]) Tarjan(i);
47 for (int i=1;i<=n;i++)
48 for (int j=head[0][i];j;j=e[0][j].y)
49 if (bel[i]!=bel[e[0][j].x])
50 insert(1,bel[i],bel[e[0][j].x]),Num[bel[e[0][j].x]]++;
51 for (int i=1;i<=num;i++) fa[i]=i;
52 for (int i=1;i<=num;i++) if (!Num[i]&!b[i]) work(i);
53 for (int i=1;i<=num;i++) getfather(i),ans[fa[i]]=max(ans[fa[i]],f[i]);
54 sort(ans+1,ans+num+1);
55 for (int i=num;i>=max(1,num-K);i--) Ans+=ans[i];
56 printf("%d",Ans);
57 }