12
 1378
 51202278
 989898989
 4
 7
 9
 6
 8
 12193721
 999999995
 999999999
 11
 999999996
 999999998
 3
 14
 15
 10
 999999994
 1000
 13781378
 5
 999999997
 1000000000
 13
 16
 0

6
 4
 4
 8
 6
 2
 8
 4
 6
 8
 2
 2
 2
 6
 4
 2
 4
 2
 4
 4
 6
 4
 8
 8
 6
 8
 6
 1

#include <bits/stdc++.h>
using namespace std;
const int N = 1234;
int n, m, max_peso, peso[N], bele[N];
vector<int> adj[N], aux;
vector<vector<int> > grupos;
int dp[N][N], tot_bele[N], tot_peso[N], vis[N];
void dfs(int v) {
  vis[v] = 1;
  aux.push_back(v);
  for (int i = 0; i < adj[v].size(); i++) {
    int u = adj[v][i];
    if (!vis[u]) dfs(u);
  }
}
int ans = 0;
int solve(int pesos, int grupo) {
  if (grupo >= grupos.size()) return 0;
  if (dp[pesos][grupo] != -1) return dp[pesos][grupo];
  int res = 0;
  if (pesos + tot_peso[grupo] <= max_peso)
    res = solve(pesos + tot_peso[grupo], grupo + 1) + tot_bele[grupo];
  for (int i = 0; i < grupos[grupo].size(); i++) {
    int v = grupos[grupo][i];
    if (pesos + peso[v] <= max_peso)
      res = max(res, solve(pesos + peso[v], grupo + 1) + bele[v]);
  }
  ans = max(ans, res);
  return dp[pesos][grupo] = res;
}
int main() {
  memset(dp, -1, sizeof dp);
  scanf("%d%d%d", &n, &m, &max_peso);
  for (int i = 0; i < n; i++) {
    vis[i] = 0;
    scanf("%d", peso + i);
  }
  for (int i = 0; i < n; i++) {
    scanf("%d", bele + i);
  }
  for (int i = 0; i < m; i++) {
    int pi, po;
    scanf("%d%d", &pi, &po);
    pi--;
    po--;
    adj[pi].push_back(po);
    adj[po].push_back(pi);
  }
  for (int i = 0; i < n; i++) {
    if (!vis[i]) {
      aux.clear();
      dfs(i);
      grupos.push_back(aux);
    }
  }
  for (int i = 0; i < grupos.size(); i++) {
    int tot = 0, tot1 = 0;
    for (int j = 0; j < grupos[i].size(); j++) {
      tot += peso[grupos[i][j]];
      tot1 += bele[grupos[i][j]];
    }
    tot_bele[i] = tot1;
    tot_peso[i] = tot;
  }
  solve(0, 0);
  printf("%d\n", ans);
  return 0;
}
