#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
****************************************************************/