class disjoint:
def __init__(self,n):
self.rank=[1]*n
self.parent=[i for i in range(n)]
def find(self,x):
if(self.parent[x]!=x):
self.parent[x]=self.find(self.parent[x])
return self.parent[x];
def union(self,x,y):
xid=self.find(x)
yid=self.find(y)
if(xid==yid):
return;
if(self.rank[xid]<self.rank[yid]):
self.parent[xid]=yid
return;
elif(self.rank[xid]>self.rank[yid]):
self.parent[yid]=xid # merging y into x
return;
else:
self.parent[yid]=xid
self.rank[xid]+=1
return;
import sys
input=sys.stdin.readline
n,m,w=map(int,input().split())
obj=disjoint(n)
z=list(map(int,input().split()))
be=list(map(int,input().split()))
ans=[]
for i in range(len(z)):
ans.append([i,z[i],be[i]])
for i in range(m):
p,q=map(int,input().split())
obj.union(p-1,q-1)
from collections import *
al=defaultdict(list)
for i in range(len(ans)):
y=obj.find(ans[i][0])
al[y].append(ans[i][0])
dp=[[0 for i in range(len(al)+1)] for i in range(w+1)]
c1=0
for i in al:
if(c1==0):
q=al[i]
total=0
bea=0
for x in q:
wei=ans[x][1]
if(wei<=w):
dp[wei][c1]=max(dp[wei][c1],ans[x][2])
total+=wei
bea+=ans[x][2]
if(total<=w):
dp[total][c1]=max(dp[total][c1],bea)
c1+=1
else:
q=al[i]
total=0
dil=0
bea=0
wei=0
for x in q:
wei=ans[x][1]
bea=ans[x][2]
total+=wei
dil+=bea
for j in range(w+1):
if(wei>j):
dp[j][c1]=max(dp[j][c1-1],dp[j][c1])
continue;
else:
dp[j][c1]=max(dp[j][c1],dp[j-wei][c1-1]+bea,dp[j][c1-1])
if(total<=w):
dp[total][c1]=max(dp[total][c1-1],dil,dp[total][c1])
c1+=1
maxa=0
for j in range(w+1):
maxa=max(maxa,dp[j][c1-1])
print(maxa)