#include<stdio.h>
int n, m, maxW, p[2000], w[2000], b[2000], prev[2000], next[2000], gb[2000],gw[2000];
int root(int i)
{
if(p[i]!=i)
p[i] = root(p[i]);
return p[i];
}
int main()
{
scanf("%i%i%i",&n,&m,&maxW);
for(int i=0;i<n;i++)
scanf("%i",w+i);
for(int i=0;i<n;i++)
scanf("%i",b+i);
int x, y;
for(int i=0;i<n;i++)
p[i]=i;
for(int i=0;i<m;i++)
{
scanf("%i%i",&x,&y);
x--;
y--;
p[root(x)]=root(y);
}
prev[0] = 0;
for(int v=1;v<=maxW;v++)
prev[v] = -1;
for(int i=0;i<n;i++)
if(p[i]==i)
{
int k = 0;
for(int j=0;j<n;j++)
if(root(j)==i)
{
gb[k]=b[j];
gw[k]=w[j];
k++;
}
/* for(int j=0;j<k;j++) */
/* printf("%i ",gb[j]); */
/* printf("\n"); */
for(int v=0;v<=maxW;v++)
next[v]=prev[v];
for(int v=0;v<maxW;v++)
if(prev[v]>=0)
for(int j=0;j<k;j++)
{
int y = gw[j]+v;
int s = gb[j]+prev[v];
if(y<=maxW && s>next[y])
next[y] = s;
}
int tb = 0;
int tw = 0;
for(int j=0;j<k;j++)
{
tb+=gb[j];
tw+=gw[j];
}
for(int v=0;v<maxW;v++)
if(prev[v]>=0 && v+tw<=maxW && prev[v]+tb>next[v+tw])
next[v+tw] = tb+prev[v];
for(int v=0;v<=maxW;v++)
prev[v] = next[v];
}
int max = 0;
for(int v=0;v<=maxW;v++)
if(prev[v]>max)
max = prev[v];
printf("%i\n",max);
}
#include<stdio.h>
int n, m, maxW, p[2000], w[2000], b[2000], prev[2000], next[2000], gb[2000],gw[2000];
int root(int i)
{
if(p[i]!=i)
p[i] = root(p[i]);
return p[i];
}
int main()
{
scanf("%i%i%i",&n,&m,&maxW);
for(int i=0;i<n;i++)
scanf("%i",w+i);
for(int i=0;i<n;i++)
scanf("%i",b+i);
int x, y;
for(int i=0;i<n;i++)
p[i]=i;
for(int i=0;i<m;i++)
{
scanf("%i%i",&x,&y);
x--;
y--;
p[root(x)]=root(y);
}
prev[0] = 0;
for(int v=1;v<=maxW;v++)
prev[v] = -1;
for(int i=0;i<n;i++)
if(p[i]==i)
{
int k = 0;
for(int j=0;j<n;j++)
if(root(j)==i)
{
gb[k]=b[j];
gw[k]=w[j];
k++;
}
/* for(int j=0;j<k;j++) */
/* printf("%i ",gb[j]); */
/* printf("\n"); */
for(int v=0;v<=maxW;v++)
next[v]=prev[v];
for(int v=0;v<maxW;v++)
if(prev[v]>=0)
for(int j=0;j<k;j++)
{
int y = gw[j]+v;
int s = gb[j]+prev[v];
if(y<=maxW && s>next[y])
next[y] = s;
}
int tb = 0;
int tw = 0;
for(int j=0;j<k;j++)
{
tb+=gb[j];
tw+=gw[j];
}
for(int v=0;v<maxW;v++)
if(prev[v]>=0 && v+tw<=maxW && prev[v]+tb>next[v+tw])
next[v+tw] = tb+prev[v];
for(int v=0;v<=maxW;v++)
prev[v] = next[v];
}
int max = 0;
for(int v=0;v<=maxW;v++)
if(prev[v]>max)
max = prev[v];
printf("%i\n",max);
}