#include <bits/stdc++.h>
using namespace std;
const long long N = 2 * 1e5 + 5;
long long tot, nex[2 * N], tov[2 * N], val[2 * N], head[N];
long long anc[N][25], ma[N][25], dep[N], n, m, fat[N], mon;
long long id[N][25], pos, Id[2 * N], d1, d2, d3;
bool ins[N];
long long ans = 0;
struct edge {
  long long u, v, w, c, idd;
} e[N];
bool cmp(const edge& a, const edge& b) { return a.w < b.w; }
bool cmpx(const edge& a, const edge& b) { return a.idd < b.idd; }
long long find_fa(long long u) {
  return u == fat[u] ? u : fat[u] = find_fa(fat[u]);
}
void add(long long u, long long v, long long w, long long id) {
  tot++;
  nex[tot] = head[u];
  tov[tot] = v;
  val[tot] = w;
  Id[tot] = id;
  head[u] = tot;
}
void dfs(long long u, long long fa) {
  for (long long p = 1; p <= 20; p++)
    anc[u][p] = anc[anc[u][p - 1]][p - 1],
    ma[u][p] = max(ma[u][p - 1], ma[anc[u][p - 1]][p - 1]),
    id[u][p] = ma[u][p - 1] > ma[anc[u][p - 1]][p - 1]
                   ? id[u][p - 1]
                   : id[anc[u][p - 1]][p - 1];
  for (long long i = head[u]; i; i = nex[i]) {
    long long v = tov[i];
    if (v == fa) continue;
    anc[v][0] = u, ma[v][0] = val[i], dep[v] = dep[u] + 1, id[v][0] = Id[i];
    dfs(v, u);
  }
}
long long find_lca(long long u, long long v) {
  if (dep[u] < dep[v]) swap(u, v);
  long long del = dep[u] - dep[v];
  for (long long p = 20; p >= 0; p--)
    if (del & (1 << p)) u = anc[u][p];
  if (u == v) return u;
  for (long long p = 20; p >= 0; p--)
    if (anc[u][p] != anc[v][p]) u = anc[u][p], v = anc[v][p];
  return anc[u][0];
}
long long get_max(long long u, long long v) {
  long long lca = find_lca(u, v), ans = -1e9;
  long long del = dep[u] - dep[lca];
  for (long long p = 20; p >= 0; p--)
    if (del & (1 << p)) {
      if (ans < ma[u][p]) {
        ans = ma[u][p];
        pos = id[u][p];
      }
      u = anc[u][p];
    }
  del = dep[v] - dep[lca];
  for (long long p = 20; p >= 0; p--)
    if (del & (1 << p)) {
      if (ans < ma[v][p]) {
        ans = ma[v][p];
        pos = id[v][p];
      }
      v = anc[v][p];
    }
  return ans;
}
int main() {
  scanf("%lld%lld", &n, &m);
  for (long long i = 1; i <= m; i++) scanf("%lld", &e[i].w);
  for (long long i = 1; i <= m; i++) scanf("%lld", &e[i].c);
  for (long long i = 1; i <= m; i++) {
    scanf("%lld%lld", &e[i].u, &e[i].v);
    e[i].idd = i;
  }
  sort(e + 1, e + m + 1, cmp);
  for (long long i = 1; i <= n; i++) fat[i] = i;
  for (long long i = 1; i <= m; i++) {
    long long fau = find_fa(e[i].u), fav = find_fa(e[i].v);
    if (fau != fav) {
      fat[fau] = fav;
      add(e[i].u, e[i].v, e[i].w, i);
      add(e[i].v, e[i].u, e[i].w, i);
      ins[i] = true;
      ans += 1ll * e[i].w;
    }
  }
  scanf("%lld", &mon);
  dfs(1, 1);
  long long Ans = 1e18;
  bool tag = false;
  long long del;
  for (long long i = 1; i <= m; i++) {
    long long del = mon / e[i].c;
    if (ins[i]) {
      if (Ans > ans - del) {
        Ans = ans - del;
        d3 = i;
      }
    } else {
      long long l = get_max(e[i].u, e[i].v);
      if (Ans > ans - 1ll * l + e[i].w - del) {
        Ans = ans - 1ll * l + e[i].w - del;
        d1 = pos, d2 = i;
        tag = true;
      }
    }
  }
  printf("%lld\n", Ans);
  if (tag) del = mon / e[d2].c;
  if (tag && Ans == ans - 1ll * e[d1].w + e[d2].w - del) {
    ins[d1] = false;
    ins[d2] = true;
    e[d2].w -= del;
  } else {
    e[d3].w -= mon / e[d3].c;
  }
  for (long long i = 1; i <= m; i++)
    if (ins[i]) printf("%lld %lld\n", e[i].idd, e[i].w);
}
