#include <bits/stdc++.h>
long long ANS, SUM;
int N, M, E, head[200001], next[400001], to[400001], len[400001], id[400001],
    J[18][200001], JM[18][200001],
    *fa = J[0], *fe = JM[0], fid[200001], LOG, q[200001], f[200001], S,
    onmst[200001], MINC = 1000000001, more, removedW, dep[200001],
    store_c[200001];
struct edge {
  int u, v, w, c, id;
} p[200001];
inline bool operator<(const edge &a, const edge &b) { return a.w < b.w; }
int F(int x) { return f[x] == x ? x : f[x] = F(f[x]); }
inline int max(int x, int y) { return x > y ? x : y; }
inline void add(int u, int v, int w, int i) {
  next[++E] = head[u], to[E] = v, len[E] = w, id[E] = i, head[u] = E;
  next[++E] = head[v], to[E] = u, len[E] = w, id[E] = i, head[v] = E;
}
int LCA(int u, int v) {
  int S = 0;
  for (int i = LOG; ~i; i--) {
    if (dep[u] - dep[v] >= 1 << i) S = max(S, JM[i][u]), u = J[i][u];
    if (dep[v] - dep[u] >= 1 << i) S = max(S, JM[i][v]), v = J[i][v];
  }
  if (u == v) return S;
  for (int i = LOG; ~i; i--)
    if (J[i][u] != J[i][v]) {
      S = max(S, max(JM[i][u], JM[i][v]));
      u = J[i][u], v = J[i][v];
    }
  return max(S, max(fe[u], fe[v]));
}
int main() {
  scanf("%d%d", &N, &M);
  for (int i = 1; i <= M; i++) scanf("%d", &p[i].w), p[i].id = i;
  for (int i = 1; i <= M; i++) scanf("%d", &p[i].c), store_c[i] = p[i].c;
  for (int i = 1; i <= M; i++) scanf("%d%d", &p[i].u, &p[i].v);
  scanf("%d", &S);
  std::sort(p + 1, p + M + 1);
  for (int i = 1; i <= N; i++) f[i] = i;
  for (int i = 1; i <= M; i++) {
    int u = p[i].u, v = p[i].v, w = p[i].w, c = p[i].c, fu = F(u), fv = F(v),
        id = p[i].id;
    if (fu != fv) {
      add(u, v, w, id);
      ANS += w;
      if (c < MINC) MINC = c;
      onmst[i] = 1;
      f[fu] = fv;
    }
  }
  SUM = ANS;
  ANS -= S / MINC;
  int *H = q, *T = q + 1;
  *T = 1;
  while (H < T)
    for (int u = *++H, e = head[u]; e; e = next[e])
      if (to[e] != fa[u])
        fa[ *++T = to[e]] = u, fe[*T] = len[e], fid[*T] = id[e],
                   dep[*T] = dep[u] + 1;
  while (2 << LOG < N) LOG++;
  for (int i = 1; i <= LOG; i++)
    for (int j = 1; j <= N; j++)
      J[i][j] = J[i - 1][J[i - 1][j]],
      JM[i][j] = max(JM[i - 1][j], JM[i - 1][J[i - 1][j]]);
  for (int i = 1; i <= M; i++)
    if (!onmst[i] && p[i].c < MINC) {
      long long lca = LCA(p[i].u, p[i].v),
                CUR = SUM + p[i].w - lca - S / p[i].c;
      if (CUR < ANS) {
        ANS = CUR;
        more = i;
        removedW = lca;
      }
    }
  printf("%lld\n", ANS);
  if (!more) {
    int found = 0;
    for (int i = 1; !found; i++)
      if (onmst[i] && p[i].c == MINC)
        found = fa[p[i].u] == p[i].v ? p[i].u : p[i].v;
    for (int i = 2; i <= N; i++)
      printf("%d %d\n", fid[i], fe[i] - (found == i ? S / MINC : 0));
  } else {
    int u = p[more].u, v = p[more].v, found = 0;
    while (dep[u] > dep[v] && !found) {
      if (fe[u] == removedW) found = u;
      u = fa[u];
    }
    while (dep[v] > dep[u] && !found) {
      if (fe[v] == removedW) found = v;
      v = fa[v];
    }
    while (u != v && !found) {
      if (fe[u] == removedW)
        found = u;
      else if (fe[v] == removedW)
        found = v;
      u = fa[u], v = fa[v];
    }
    printf("%d %d\n", p[more].id, p[more].w - S / p[more].c);
    for (int i = 2; i <= N; i++)
      if (i != found) printf("%d %d\n", fid[i], fe[i]);
  }
  return 0;
}
