#include <bits/stdc++.h>   using namespace std;   void dfs(set<int> &temp, list<int> adj[], vector<bool> &v, int s, int &t1,            int &t2, vector<int> b, vector<int> w) {     v[s] = true;     list<int>::iterator it;     for (it = adj[s].begin(); it != adj[s].end(); it++) {       if (!v[*it]) {         temp.insert(*it);         t1 += b[*it];         t2 += w[*it];         dfs(temp, adj, v, *it, t1, t2, b, w);       }     }   }   list<int> adj[1001];   int main() {     int n, m, weight;     cin >> n >> m >> weight;     vector<int> b(n + 1);     vector<int> w(n + 1);     for (int i = 1; i <= n; i++) cin >> w[i];     for (int i = 1; i <= n; i++) cin >> b[i];     for (int i = 0; i < m; i++) {       int a, b;       cin >> a >> b;       adj[a].push_back(b);       adj[b].push_back(a);     }     vector<bool> v(n + 1, false);     vector<set<int> > arr;     vector<int> tw;     vector<int> tb;     for (int i = 1; i <= n; i++) {       if (!v[i]) {         set<int> temp;         temp.insert(i);         int t1 = b[i], t2 = w[i];         dfs(temp, adj, v, i, t1, t2, b, w);         arr.push_back(temp);         tb.push_back(t1);         tw.push_back(t2);       }     }     vector<vector<int> > dp(arr.size() + 1, vector<int>(weight + 1, 0));     for (int i = 1; i <= arr.size(); i++) {       for (int j = 1; j <= weight; j++) {         int max = 0;         if (dp[i - 1][j] > max) max = dp[i - 1][j];         if (j - tw[i - 1] >= 0)           if (dp[i - 1][j - tw[i - 1]] + tb[i - 1] > max)             max = dp[i - 1][j - tw[i - 1]] + tb[i - 1];         set<int>::iterator it;         for (it = arr[i - 1].begin(); it != arr[i - 1].end(); it++) {           if (j - w[*it] >= 0)             if (dp[i - 1][j - w[*it]] + b[*it] > max)               max = dp[i - 1][j - w[*it]] + b[*it];         }         dp[i][j] = max;       }     }     int max = 0;     for (int i = 0; i <= weight; i++)       if (dp[arr.size()][i] > max) max = dp[arr.size()][i];     cout << max;     return 0;   }   