#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 7;
int n, m, S;
int fa[N][20], mx[N][20], dep[N], f[N], vis[N];
struct Edge {
  int u, v, w, c, id;
} e[N];
vector<int> ve[N];
void dfs(int x) {
  dep[x] = dep[fa[x][0]] + 1;
  for (int i = 1; i <= 18; ++i)
    fa[x][i] = fa[fa[x][i - 1]][i - 1],
    mx[x][i] = e[mx[x][i - 1]].w > e[mx[fa[x][i - 1]][i - 1]].w
                   ? mx[x][i - 1]
                   : mx[fa[x][i - 1]][i - 1];
  for (auto id : ve[x]) {
    int y = e[id].u == x ? e[id].v : e[id].u;
    if (y == fa[x][0]) continue;
    fa[y][0] = x;
    mx[y][0] = id;
    dfs(y);
  }
}
inline int find(int x) { return f[x] == x ? x : f[x] = find(f[x]); }
inline int query(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  int id = 0;
  for (int k = dep[x] - dep[y], i = 0; k; ++i)
    if (k >> i & 1)
      id = e[id].w > e[mx[x][i]].w ? id : mx[x][i], x = fa[x][i], k ^= 1 << i;
  if (x == y) return id;
  for (int i = 18; ~i; --i)
    if (fa[x][i] != fa[y][i])
      id = e[id].w > e[mx[x][i]].w ? id : mx[x][i],
      id = e[id].w > e[mx[y][i]].w ? id : mx[y][i], x = fa[x][i], y = fa[y][i];
  return id = e[id].w > e[mx[x][0]].w ? id : mx[x][0],
         id = e[id].w > e[mx[y][0]].w ? id : mx[y][0];
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; ++i) scanf("%d", &e[i].w);
  for (int i = 1; i <= m; ++i) scanf("%d", &e[i].c);
  for (int i = 1; i <= m; ++i) scanf("%d%d", &e[i].u, &e[i].v), e[i].id = i;
  sort(e + 1, e + m + 1,
       [](const Edge &a, const Edge &b) { return a.w < b.w; });
  for (int i = 1; i <= n; ++i) f[i] = i;
  long long sum = 0, ans = 1e18;
  int ID;
  for (int i = 1; i <= m; ++i) {
    int x = find(e[i].u), y = find(e[i].v);
    if (x == y) continue;
    vis[i] = 1;
    sum += e[i].w;
    f[x] = y;
    ve[e[i].u].push_back(i);
    ve[e[i].v].push_back(i);
  }
  dfs(1);
  scanf("%d", &S);
  for (int i = 1; i <= m; ++i) {
    int id = query(e[i].u, e[i].v);
    long long now = sum - e[id].w + e[i].w - S / e[i].c;
    if (now < ans) ans = now, ID = i;
  }
  printf("%lld\n", ans);
  int id = query(e[ID].u, e[ID].v);
  if (id != ID) vis[id] = 0, vis[ID] = 1;
  e[ID].w -= S / e[ID].c;
  for (int i = 1; i <= m; ++i)
    if (vis[i]) printf("%d %d\n", e[i].id, e[i].w);
  return 0;
}
