#include<bits/stdc++.h>
using namespace std;
int f[10100];//存储物品之间的关系
int q[10100],v[10100];//价钱、价值
int dp[10100];//以拥有的钱来定义背包容量
//查:查询元素的根
int find(int x){
return f[x]==x?x:f[x]=find(f[x]);
}
//并:合并元素xy
void merge(int x,int y){
int fx = find(x);
int fy = find(y);
if(fx != fy){
f[fx] = fy;
}
}
int main() {
int n,m,w;
cin>>n>>m>>w;
//n个物品的价钱和价值
for(int i = 1;i <= n;i++){
cin>>q[i]>>v[i];
//并查集初始化
f[i] = i;
}
//m个物品的关系
int x,y;
for(int i = 1;i <= m;i++){
cin>>x>>y;
merge(x,y);
}
//将有关系的物品合并到这组物品的根上
for(int i = 1;i <= n;i++){
//该物品不是根,则将价钱和价值都合并到根上
if(f[i] != i){
q[find(i)]+=q[i];
v[find(i)]+=v[i];
//将该组物品的价钱和价值清零
q[i]=0;
v[i]=0;
}
}
//01背包计算结果
for(int i = 1;i <= n;i++){
//从背包容量(有多少钱)~该物品的价钱降序
for(int j = w;j >= q[i];j--){
dp[j] = max(dp[j],dp[j-q[i]]+v[i]);
}
}
cout<<dp[w];
return 0;
}
/**************************************************************
Problem: 1928
User: admin
Language: C++
Result: Accepted
Time:81 ms
Memory:2260 kb
****************************************************************/