#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e9 + 7;
const long long INF = 5e18 + 3;
const long long logs = 25;
const long long max_n = 2e5 + 100;
struct edge {
  long long from, to, ind;
  edge() {}
  edge(long long from, long long to, long long ind)
      : from(from), to(to), ind(ind) {}
};
struct dsu {
  long long n;
  vector<long long> p;
  vector<long long> sz;
  dsu(long long n) : n(n) {
    p.assign(n, 0);
    sz.assign(n, 1);
    iota(p.begin(), p.end(), 0);
  }
  long long find(long long x) {
    if (x == p[x]) return x;
    return p[x] = find(p[x]);
  }
  void merge(long long a, long long b) {
    a = find(a);
    b = find(b);
    if (sz[a] < sz[b]) swap(a, b);
    if (a != b) {
      p[b] = a;
      sz[a] += sz[b];
    }
  }
};
vector<pair<long long, long long>> a[max_n];
vector<vector<long long>> up;
vector<vector<long long>> dp;
long long w[max_n], c[max_n], h[max_n];
bool used[max_n], last[max_n];
vector<edge> ed;
bool comp(edge &A, edge &B) { return w[A.ind] < w[B.ind]; }
long long get(long long v, long long u) {
  if (h[u] < h[v]) swap(u, v);
  long long del = h[u] - h[v];
  long long mmm = 2e5 + 31;
  for (long long i = 0; i < logs; i++)
    if (((1 << i) & del) != 0) {
      if (w[dp[i][u]] > w[mmm]) mmm = dp[i][u];
      u = up[i][u];
    }
  if (v == u) return mmm;
  for (long long i = logs - 1; i >= 0; i--) {
    if (up[i][v] != up[i][u]) {
      if (w[dp[i][u]] > w[mmm]) mmm = dp[i][u];
      if (w[dp[i][v]] > w[mmm]) mmm = dp[i][v];
      u = up[i][u];
      v = up[i][v];
    }
  }
  if (w[dp[0][v]] > w[mmm]) mmm = dp[0][v];
  if (w[dp[0][u]] > w[mmm]) mmm = dp[0][u];
  return mmm;
}
void dfs(long long v, long long ind, long long p = 0) {
  up[0][v] = p;
  dp[0][v] = ind;
  for (auto to : a[v]) {
    if (to.first == p) continue;
    h[to.first] = h[v] + 1;
    dfs(to.first, to.second, v);
  }
}
signed main() {
  cin.tie(0);
  cout.tie(0);
  ios_base::sync_with_stdio(0);
  long long n, m;
  cin >> n >> m;
  ed.assign(m, {0, 0, 0});
  for (long long i = 0; i < m; i++) cin >> w[i];
  for (long long i = 0; i < m; i++) cin >> c[i];
  for (long long i = 0; i < m; i++) {
    cin >> ed[i].from >> ed[i].to;
    ed[i].from--, ed[i].to--, ed[i].ind = i;
  }
  long long S;
  cin >> S;
  sort(ed.begin(), ed.end(), comp);
  dsu d = {n};
  for (long long i = 0; i < m; i++) {
    if (d.find(ed[i].from) != d.find(ed[i].to)) {
      d.merge(ed[i].from, ed[i].to);
      used[ed[i].ind] = true;
    }
  }
  for (long long i = 0; i < m; i++) {
    if (used[ed[i].ind]) {
      a[ed[i].from].emplace_back(ed[i].to, ed[i].ind);
      a[ed[i].to].emplace_back(ed[i].from, ed[i].ind);
    }
  }
  up.assign(logs, vector<long long>(n, 0));
  dp.assign(logs, vector<long long>(n, 0));
  w[(long long)(2e5 + 31)] = -INF;
  dfs(0, 2e5 + 31);
  for (long long i = 1; i < logs; i++)
    for (long long j = 0; j < n; j++) up[i][j] = up[i - 1][up[i - 1][j]];
  for (long long i = 1; i < logs; i++)
    for (long long j = 0; j < n; j++)
      if (w[dp[i - 1][j]] < w[dp[i - 1][up[i - 1][j]]])
        dp[i][j] = dp[i - 1][up[i - 1][j]];
      else
        dp[i][j] = dp[i - 1][j];
  long long ans = INF;
  long long sum = 0;
  long long poch_wa_100 = -1337;
  for (long long i = 0; i < m; i++) {
    if (used[ed[i].ind]) {
      sum += w[ed[i].ind];
      last[ed[i].ind] = true;
    }
  }
  for (long long i = 0; i < m; i++) {
    if (used[ed[i].ind]) {
      long long loc = sum - S / c[ed[i].ind];
      if (loc < ans) {
        poch_wa_100 = -1337;
        ans = loc;
      }
      continue;
    }
    long long ind = get(ed[i].from, ed[i].to);
    long long we = w[ed[i].ind] - S / c[ed[i].ind];
    long long loc = sum - w[ind] + we;
    if (loc < ans) {
      ans = loc;
      poch_wa_100 = i;
    }
  }
  cout << ans << "\n";
  if (poch_wa_100 != -1337) {
    last[ed[poch_wa_100].ind] = true;
    last[get(ed[poch_wa_100].from, ed[poch_wa_100].to)] = false;
  }
  long long ind = -1;
  for (long long i = 0; i < m; i++) {
    if (!last[i]) continue;
    if (ind == -1 || c[ind] > c[i]) ind = i;
  }
  for (long long i = 0; i < m; i++) {
    if (last[i]) {
      long long val = w[i];
      if (i == ind) val -= S / c[i];
      cout << i + 1 << " " << val << "\n";
    }
  }
}
