#include <bits/stdc++.h>
using namespace std;
int n, m, mother[200005], fa[200005][21], val[200005][21], dep[200005];
int lnk[200005], nxt[(200005 << 1)], son[(200005 << 1)], w[(200005 << 1)],
    tot = 1, S, cs, tid[200005];
long long ans = 1ll << 60, sum = 0;
bool vis[200005];
class Edges {
 public:
  int x, y, w, c, id;
  bool operator<(const Edges &b) const { return w < b.w; }
} e[200005];
inline int read() {
  char ch = getchar();
  int ret = 0, f = 1;
  while (ch > '9' || ch < '0') {
    if (ch == '-') f = -f;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') ret = ret * 10 + ch - '0', ch = getchar();
  return ret * f;
}
inline void adde(int x, int y, int z) {
  son[++tot] = y, nxt[tot] = lnk[x], lnk[x] = tot, w[tot] = z;
}
void DFS(int now, int pre, int dp) {
  dep[now] = dp, fa[now][0] = pre;
  for (int i = 1; i < 20; ++i) {
    fa[now][i] = fa[fa[now][i - 1]][i - 1];
    val[now][i] = max(val[now][i - 1], val[fa[now][i - 1]][i - 1]);
  }
  for (int j = lnk[now]; j; j = nxt[j]) {
    if (son[j] == pre) continue;
    val[son[j]][0] = e[w[j]].w;
    tid[son[j]] = w[j];
    DFS(son[j], now, dp + 1);
  }
}
int Query(int x, int y) {
  int res = 0;
  if (dep[x] < dep[y]) swap(x, y);
  for (int i = 19; i >= 0; --i) {
    if (dep[fa[x][i]] >= dep[y]) {
      res = max(res, val[x][i]);
      x = fa[x][i];
    }
  }
  if (x == y) return res;
  for (int i = 19; i >= 0; --i) {
    if (fa[x][i] != fa[y][i]) {
      res = max(res, max(val[x][i], val[y][i]));
      x = fa[x][i], y = fa[y][i];
    }
  }
  res = max(res, max(val[x][0], val[y][0]));
  return res;
}
bool cmp(const Edges a, const Edges b) { return a.id < b.id; }
void reMove(int x, int y) {
  int maxi = -1, id = 0;
  while (x != y) {
    if (dep[x] < dep[y]) swap(x, y);
    if (e[tid[x]].w > maxi) {
      maxi = e[tid[x]].w;
      id = tid[x];
    }
    x = fa[x][0];
  }
  vis[id] = 0;
}
int getmother(int x) {
  return mother[x] == x ? x : mother[x] = getmother(mother[x]);
}
int main() {
  n = read(), m = read();
  for (int i = 1; i <= m; ++i) e[i].w = read(), e[i].id = i;
  for (int i = 1; i <= m; ++i) e[i].c = read();
  for (int i = 1; i <= m; ++i) e[i].x = read(), e[i].y = read();
  S = read();
  for (int i = 1; i <= n; ++i) mother[i] = i;
  sort(e + 1, e + 1 + m);
  for (int i = 1; i <= m; ++i) {
    int fx = getmother(e[i].x), fy = getmother(e[i].y);
    if (fx != fy) {
      vis[e[i].id] = 1;
      adde(e[i].x, e[i].y, e[i].id);
      adde(e[i].y, e[i].x, e[i].id);
      sum += 1ll * e[i].w;
      mother[fx] = fy;
    }
  }
  sort(e + 1, e + 1 + m, cmp);
  DFS(1, 0, 1);
  for (int i = 1; i <= m; ++i) {
    if (vis[i]) {
      if (sum - (S / e[i].c) < ans) ans = sum - (S / e[i].c), cs = i;
    } else {
      long long res = sum - Query(e[i].x, e[i].y);
      res += e[i].w - (S / e[i].c);
      if (res < ans) ans = res, cs = i;
    }
  }
  if (!vis[cs]) reMove(e[cs].x, e[cs].y);
  vis[cs] = 1;
  int len = 0;
  cout << ans << endl;
  for (int i = 1; i <= m; ++i) {
    if (!vis[i]) continue;
    printf("%d ", i);
    if (i == cs)
      printf("%d\n", e[i].w - (S / e[i].c));
    else
      printf("%d\n", e[i].w);
  }
  return 0;
}
