WA on #2 #3 #5
#include<bits/stdc++.h>
using namespace std;
int n,m,w1,v1,u;
int fa[10010],w[10010],v[10010],dp[10010];
int find(int x){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
void merge(int x,int y){
int fx,fy;
fx=find(x);
fy=find(y);
if(fx!=fy) fa[fx]=fy;
}
int main(){
cin>>n>>m>>w1;
for(int i=1;i<=n;i++){
fa[i]=i;
}
for(int i=1;i<=n;i++){
cin>>w[i]>>v[i];
}
for(int i=1;i<=m;i++){
cin>>u>>v1;
merge(u,v1);
}
for(int i=1;i<=n;i++){
if(fa[i]!=i){
w[fa[i]]=w[fa[i]]+w[i];
v[fa[i]]=v[fa[i]]+v[i];
w[i]=0;
v[i]=0;
}
}
for(int i=1;i<=n;i++){
if(w[i]==0 && v[i]==0) continue;
for(int j=w1;j>=w[i];j--){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
cout<<dp[w1];
return 0;
}