#include <bits/stdc++.h>
using namespace std;
void ga(int N, int *A) {
  for (int i(0); i < N; i++) scanf("%d", A + i);
}
struct nd {
  int a, b, w, is, I;
  bool operator<(const nd &r) const { return w < r.w; }
} G[(1 << (18))];
int C[(1 << (18))], R[(1 << (18))], w;
int Geco(int a) { return C[a] = (a == C[a] ? a : Geco(C[a])); }
bool con(int a, int b) {
  if (Geco(a) == Geco(b)) return 0;
  if (R[C[a]] > R[C[b]])
    C[C[b]] = C[a];
  else
    R[C[b]] += R[C[a]] == R[C[b]], C[C[a]] = C[b];
  return --w, 1;
}
int N, M, W[(1 << (18))], p[(1 << (18))], a, b,
    J = -1, X[(1 << (18))], f[(1 << (18))], t[(1 << (18))], Z;
long long K, B = 0;
vector<pair<int, int> > g[(1 << (18))];
int D[(1 << (18))], P[(1 << (18))][(18) + 1], V[(1 << (18))][(18) + 1];
void vnd(int u, int p, int d, int w) {
  *P[u] = p, *V[u] = w, D[u] = d++;
  for (auto &h : g[u])
    if (h.first ^ p) vnd(h.first, u, d, h.second);
}
void st(int N, int r = 0) {
  vnd(r, r, 0, 0);
  for (int i(0); i < (18); i++)
    for (int j(0); j < N; j++)
      P[j + 1][i + 1] = P[P[j + 1][i]][i],
                   V[j + 1][i + 1] = max(V[P[j + 1][i]][i], V[j + 1][i]);
}
int lca(int a, int b) {
  if (D[a] > D[b]) swap(a, b);
  int d = D[b] - D[a], s = 0, X = -(1 << 29);
  while (d)
    X = max(X, d & 1 ? V[b][s] : 0), b = d & 1 ? P[b][s] : b, d >>= 1, ++s;
  for (int i((18) - 1); ~i; --i)
    if (P[a][i] ^ P[b][i])
      X = max(X, max(V[a][i], V[b][i])), a = P[a][i], b = P[b][i];
  return a ^ b ? max(X, max(*V[a], *V[b])) : X;
}
long long spa(int M, int N) {
  long long S(0);
  sort(G, G + M);
  for (int i(0); i < M && w - 1; i++)
    if (con(G[i].a, G[i].b))
      S += G[i].w, X[G[i].I] = G[i].is = 1,
                   g[G[i].a].push_back({G[i].b, G[i].w}),
                   g[G[i].b].push_back({G[i].a, G[i].w});
  return S;
}
void tst(int I) {
  long long S;
  if (X[I])
    S = -Z / p[I];
  else
    S = W[I] - lca(f[I], t[I]) - Z / p[I];
  if (B > S) B = S, J = I;
}
int main(void) {
  scanf("%d%d", &N, &M), ga(M, W), ga(M, p),
      (iota(C, C + N, 0), (memset(R, 0, sizeof(R))), w = N);
  for (int i(0); i < M; i++)
    scanf("%d%d", &a, &b), G[i] = {--a, --b, W[i], 0, i}, f[i] = a, t[i] = b;
  K = spa(M, N), st(N), scanf("%d", &Z);
  for (int i(0); i < M; i++) tst(i);
  printf("%lld\n", K + B);
  (memset(X, 0, sizeof(X))),
      (iota(C, C + N, 0), (memset(R, 0, sizeof(R))), w = N), con(f[J], t[J]);
  spa(M, N), X[J] = 1;
  for (int i(0); i < M; i++)
    if (X[i]) printf("%d %lld\n", i + 1, i ^ J ? W[i] : W[J] - 0ll - Z / p[J]);
  return 0;
}
