#include
#include
using namespace std;
int n,m,w;int val[100010],wt[100010];
///**并查集**///
struct b
{
int par[100010];
inline void ih(){for(int i=1;i<=n;i++)par[i]=i;}
int f(int x){return par[x]=(par[x]==x)?x:f(par[x]);}
int u(int x,int y)
{
val[f(x)]+=val[f(y)];
wt[f(x)]+=wt[f(y)];
par[f(y)]=f(x);
}
}s;
int a,b;
int ans,dp[100010];
int val1[100010];int wt1[100010];int main()
{
//freopen("in","r",stdin);
scanf("%d%d%d",&n,&m,&w);
for(int i=1;i<=n;++i)
{
scanf("%d%d",&wt[i],&val[i]);
}
s.ih();
for(int i=1;i<=m;++i)
{
scanf("%d%d",&a,&b);
s.u(a,b);
}
int sum=1;
for(int i=1;i<=n;++i) /// 巧妙的操作
{
if(s.par[i]==i)
{
val1[sum]=val[s.f(i)];
wt1[sum]=wt[s.f(i)];
sum++;
}
}
///**01背包*////
for(int i=1;i<=sum;++i)
{
for(int j=w;j>=wt1[i];--j)
{
dp[j]=max(dp[j],dp[j-wt1[i]]+val1[i]);
}
}
printf("%d",dp[w]);
}