#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  for (; (ch < '0' || ch > '9') && (ch != '-'); ch = getchar())
    ;
  if (ch == '-') ch = getchar(), f = -1;
  for (; ch <= '9' && ch >= '0'; x = x * 10 + ch - 48, ch = getchar())
    ;
  return f * x;
}
int sz[400020], c[400020], i, j, k, m, n, x, S, ID, fa[400020], y, vis[400020],
    cnt, fan[400020], tot, v[400020], last[400020], now, top[400020],
    id[400020], rk[400020], dep[400020], son[400020];
long long ans, Ans;
struct edge {
  int to, next;
} e[400020 << 2];
struct node {
  int v, id, x, y;
  bool operator<(const node& b) const {
    return v < b.v || (v == b.v && id < b.id);
  }
} w[400020];
int T[400020 << 2], M;
inline void build(int n) {
  for (M = 1; M <= n + 1; M <<= 1)
    ;
  for (int i = M + 1; i <= M + n; ++i) T[i] = v[rk[i - M]];
  for (int i = M - 1; i > 0; --i) T[i] = max(T[i << 1], T[i << 1 | 1]);
}
inline int Ask(int l, int r) {
  int ans = 0;
  for (l = l + M - 1, r = r + M + 1; l ^ r ^ 1; l >>= 1, r >>= 1) {
    if (~l & 1) ans = max(ans, T[l ^ 1]);
    if (r & 1) ans = max(ans, T[r ^ 1]);
  }
  return ans;
}
int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }
inline void add(int u, int v) {
  e[++cnt] = (edge){v, last[u]}, last[u] = cnt;
  e[++cnt] = (edge){u, last[v]}, last[v] = cnt;
}
void dfs1(int x, int d) {
  sz[x] = 1, dep[x] = d;
  for (int i = last[x], y; i; i = e[i].next)
    if ((y = e[i].to) != fa[x]) {
      fa[y] = x, dfs1(y, d + 1), sz[x] += sz[y];
      if (sz[son[x]] < sz[y]) son[x] = y;
    }
}
void dfs2(int x, int d) {
  top[x] = d, rk[id[x] = ++now] = x;
  if (son[x]) dfs2(son[x], d);
  for (int i = last[x], y; i; i = e[i].next)
    if ((y = e[i].to) != son[x] && y != fa[x]) dfs2(y, y);
}
inline int ask(int l, int r) {
  int ans = 0;
  while (top[l] != top[r]) {
    if (dep[top[l]] < dep[top[r]]) swap(l, r);
    ans = max(ans, Ask(id[top[l]], id[l])), l = fa[top[l]];
  }
  if (dep[l] < dep[r]) swap(l, r);
  return max(ans, Ask(id[r], id[l]));
}
int main() {
  for (n = read(), m = read(), i = 1; i <= m; ++i) w[i].v = read(), w[i].id = i;
  for (i = 1; i <= m; ++i) c[i] = read();
  for (i = 1; i <= m; ++i) w[i].x = read(), w[i].y = read();
  S = read(), sort(w + 1, w + m + 1);
  for (i = 1; i <= m; ++i) fan[w[i].id] = i;
  for (i = 1; i <= n + m; ++i) fa[i] = i;
  for (i = 1; i <= m; ++i) {
    int p = find(w[i].x), q = find(w[i].y);
    if (p != q)
      ans += w[i].v, fa[p] = fa[q] = tot = n + w[i].id, v[tot] = w[i].v,
                     add(q, tot), add(tot, p);
  }
  memset(fa, 0, sizeof fa), dfs1(1, 1), dfs2(1, 1);
  Ans = ans, build(now);
  for (i = 1; i <= m; ++i) {
    if (!v[n + w[i].id]) {
      long long o = ans + w[i].v - S / c[w[i].id] - ask(w[i].x, w[i].y);
      if (o < Ans) Ans = o, ID = i;
    } else if (ans - S / c[w[i].id] < Ans)
      Ans = ans - S / c[w[i].id], ID = i;
  }
  cout << Ans << endl;
  if (ID) w[ID].v -= S / c[w[ID].id];
  for (i = 1; i <= n + m; ++i) fa[i] = i;
  sort(w + 1, w + m + 1);
  for (i = 1; i <= m; ++i) {
    int p = find(w[i].x), q = find(w[i].y);
    if (p != q) fa[p] = q, printf("%d %d\n", w[i].id, w[i].v);
  }
}
