#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<algorithm>
#include<functional>
#include<numeric>
#include<cmath>
using namespace std;
#define endl "\n"
#define ain(a) for(int _i=0;_i<a.size();_i++) cin >> a[_i]
#define aout(a) for(int _i=0;_i<a.size();_i++) { if(_i > 0) cout << " "; cout << a[_i]; }; cout << endl
#define couty cout << "YES\n"
#define coutn cout << "NO\n"
#define pb push_back
#define eb emplace_back
#define all(a) a.begin(),a.end()
#ifdef LOCAL_JUDGE
#include "local.hpp"
#else
template <typename Head, typename... Tail> void dout(Head&& h, Tail&&... t) {}
#endif
typedef long long ll;
typedef pair<int,int> pii; typedef pair<ll,int> pli; typedef tuple<ll,int,int> tllii;
typedef vector<int> vi; typedef vector<bool> vb; typedef vector<ll> vll; typedef vector<vector<int> > vvi; typedef vector<string> vs;
template<class T> void amin(T &a, T b) { if (a > b) a = b; }
template<class T> void amax(T &a, T b) { if (a < b) a = b; }
const ll MOD = 1e9+7;
void solve() {
int n, m , w; cin >> n >> m >> w;
vi hw(n); ain(hw);
vi hb(n); ain(hb);
vvi g(n);
for(int i=0;i<m;i++) {
int u,v;
cin >> u >> v; u--, v--;
g[u].pb(v);
g[v].pb(u);
}
// dout(g);
vi component(n,-1);
function<void(int,int)> dfs = [&](int u,int c) {
if(component[u] >= 0) return;
component[u] = c;
for(auto v:g[u]) dfs(v,c);
};
int cid=0;
for(int i=0;i<n;i++) if(component[i] < 0) {
dfs(i,cid++);
}
vector<vector<pii>> groups(cid);
for(int i=0;i<n;i++) {
int c = component[i];
groups[c].eb(hw[i],hb[i]);
}
// dout(groups);
for(auto &g:groups) {
int tw = 0, tb = 0;
for(auto [w,b]:g) {
tw += w;
tb += b;
}
g.eb(tw,tb);
}
// dout(g);
vi dp(1+w);
for(auto &g:groups) {
vi pdp = dp;
for(auto [mw,mb]:g) {
for(int tw=0;tw<=w-mw;tw++) {
dp[tw+mw] = max(dp[tw+mw],pdp[tw]+mb);
}
}
}
cout << dp[w] << endl;
}
int main(int argc,char *argv[]) {
#ifdef LOCAL_JUDGE
freopen(argc > 1 ? argv[1] : "in.txt", "r", stdin);
#endif
ios_base::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
int t = 1;
// cin >> t;
for(int i=1;i<=t;i++) {
dout("***",i);
solve();
}
}
1621A - Stable Arrangement of Rooks | 472A - Design Tutorial Learn from Math |
1368A - C+= | 450A - Jzzhu and Children |
546A - Soldier and Bananas | 32B - Borze |
1651B - Prove Him Wrong | 381A - Sereja and Dima |
41A - Translation | 1559A - Mocha and Math |
832A - Sasha and Sticks | 292B - Network Topology |
1339A - Filling Diamonds | 910A - The Way to Home |
617A - Elephant | 48A - Rock-paper-scissors |
294A - Shaass and Oskols | 1213A - Chips Moving |
490A - Team Olympiad | 233A - Perfect Permutation |
1360A - Minimal Square | 467A - George and Accommodation |
893C - Rumor | 227B - Effective Approach |
1534B - Histogram Ugliness | 1611B - Team Composition Programmers and Mathematicians |
110A - Nearly Lucky Number | 1220B - Multiplication Table |
1644A - Doors and Keys | 1644B - Anti-Fibonacci Permutation |