#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;
const long long MA = 1e6 + 5;
const long long MOD = 1e9 + 7;
long long n, m, w, p;
long long wei[1010];
long long bea[1010];
long long fat[1010];
long long dp[1010];
long long dp2[1010];
long long group[1010];
long long gwei[1010];
long long gbea[1010];
vector<long long> son[1010];
int que(int);
void uni(int a, int b) {
  if (que(a) == que(b)) return;
  fat[que(b)] = que(a);
}
int que(int a) {
  if (fat[a] == a)
    return a;
  else
    return fat[a] = que(fat[a]);
}
void read() {
  cin >> n >> m >> w;
  for (int i = 0; i < (n); i++) fat[i] = i;
  for (int i = 0; i < (n); i++) cin >> wei[i];
  for (int i = 0; i < (n); i++) cin >> bea[i];
  long long a, b;
  while (m--) {
    cin >> a >> b;
    a--;
    b--;
    uni(a, b);
  }
}
void build() {
  for (int i = 0; i < (n); i++) {
    if (que(i) == i) {
      group[i] = p;
      p++;
    }
  }
  for (int i = 0; i < (n); i++) {
    gwei[group[que(i)]] += wei[i];
    gbea[group[que(i)]] += bea[i];
    son[group[que(i)]].push_back(i);
  }
}
void solve() {
  for (int i = 0; i < p; i++) {
    ;
    memset(dp2, 0, sizeof dp2);
    for (int j = 0; j < ((int)(son[i]).size()); j++) {
      long long ww = wei[son[i][j]], bb = bea[son[i][j]];
      for (int k = w; k >= ww; k--) {
        dp2[k] = max(dp2[k], dp[k - ww] + bb);
        dp2[k] = max(dp2[k], dp[k]);
      }
    }
    for (int j = w; j >= gwei[i]; j--) {
      dp[j] = max(dp[j], dp[j - gwei[i]] + gbea[i]);
    }
    for (int j = 0; j <= w; j++) dp[j] = max(dp[j], dp2[j]);
  }
  long long ans = 0;
  for (int i = 0; i <= w; i++) ans = max(ans, dp[i]);
  cout << ans << '\n';
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  read();
  build();
  solve();
  return 0;
}
