#include <bits/stdc++.h>
using namespace std;
int read() {
  int x = 0;
  bool f = 0;
  char c = getchar();
  while (c < '0' || c > '9') f |= c == '-', c = getchar();
  while (c >= '0' && c <= '9') x = x * 10 + (c ^ 48), c = getchar();
  return f ? -x : x;
}
int N, M, S;
struct Edge {
  int u, v, w, c, id;
} E[200000 + 5];
int fa[200000 + 5];
int Find(int x) { return fa[x] == x ? x : fa[x] = Find(fa[x]); }
int Dep[200000 + 5];
int Anc[200000 + 5][20 + 5];
int Max[200000 + 5][20 + 5];
vector<pair<int, int> > G[200000 + 5];
int idMax(int i, int j) { return (E[i].w < E[j].w) ? j : i; }
void dfs(int u, int fa, int dep) {
  Dep[u] = dep;
  for (auto e : G[u]) {
    int v = e.first;
    if (v != fa) {
      Anc[v][0] = u, Max[v][0] = e.second;
      dfs(v, u, dep + 1);
    }
  }
}
int Break(int u, int v) {
  if (Dep[u] < Dep[v]) swap(u, v);
  int k = Dep[u] - Dep[v], id = 0;
  for (int i = 20; i >= 0; i--)
    if (k & (1 << i)) {
      id = idMax(id, Max[u][i]);
      u = Anc[u][i];
    }
  if (u == v) return id;
  for (int i = 20; i >= 0; i--)
    if (Anc[u][i] != Anc[v][i]) {
      id = idMax(id, Max[u][i]);
      id = idMax(id, Max[v][i]);
      u = Anc[u][i], v = Anc[v][i];
    }
  return idMax(id, idMax(Max[u][0], Max[v][0]));
}
bool AnsEdge[200000 + 5];
int main() {
  N = read(), M = read();
  for (int i = 1; i <= M; i++) E[i].w = read();
  for (int i = 1; i <= M; i++) E[i].c = read();
  for (int i = 1; i <= M; i++) E[i].u = read(), E[i].v = read(), E[i].id = i;
  S = read();
  for (int i = 1; i <= N; i++) fa[i] = i;
  sort(E + 1, E + M + 1, [=](Edge i, Edge j) { return i.w < j.w; });
  long long Ans = 0;
  int AnsCut = -1, AnsInsert = -1, AnsW = 0, MinC = int(1e9 + 5), idMinC = -1;
  for (int i = 1; i <= M; i++) {
    int u = E[i].u, v = E[i].v;
    if (Find(u) != Find(v)) {
      Ans += E[i].w;
      fa[Find(u)] = Find(v);
      AnsEdge[i] = 1;
      G[u].push_back({v, i});
      G[v].push_back({u, i});
      if (MinC > E[i].c) MinC = E[i].c, idMinC = i;
    }
  }
  long long Init = Ans - S / MinC;
  Ans = Init;
  dfs(1, -1, 1);
  for (int j = 1; j <= 20; j++)
    for (int i = 1; i <= N; i++) {
      Anc[i][j] = Anc[Anc[i][j - 1]][j - 1];
      Max[i][j] = idMax(Max[i][j - 1], Max[Anc[i][j - 1]][j - 1]);
    }
  for (int i = 1; i <= M; i++) {
    if (AnsEdge[i]) continue;
    int cut = Break(E[i].u, E[i].v);
    long long cur = Init + S / MinC - E[cut].w + E[i].w - S / E[i].c;
    if (cur < Ans) {
      Ans = cur;
      AnsCut = cut;
      AnsInsert = i;
      AnsW = E[i].w - S / E[i].c;
    }
  }
  printf("%lld\n", Ans);
  if (AnsCut != -1) {
    printf("%d %d\n", E[AnsInsert].id, AnsW);
    for (int i = 1; i <= M; i++)
      if (i != AnsCut && AnsEdge[i]) printf("%d %d\n", E[i].id, E[i].w);
  } else {
    for (int i = 1; i <= M; i++)
      if (AnsEdge[i])
        printf("%d %d\n", E[i].id,
               (i == idMinC) ? (E[i].w - S / MinC) : E[i].w);
  }
}
