#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
struct edge {
  int from, to;
  long long w, c, bh, nxt;
  bool operator<(const edge &b) const { return w < b.w; }
} e[MAXN << 2], a[MAXN << 2];
struct node {
  int bh;
  long long dis;
} maxm[MAXN][26];
int head[MAXN << 2], num_edge;
long long n, m, S, ans, cnt, flag, pre_jia, pre_jian;
int c[MAXN], w[MAXN];
long long fa[MAXN];
long long f[MAXN][26];
long long depth[MAXN];
bool vise[MAXN << 1], vis_new[MAXN << 1];
long long find(long long x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
void add(int from, int to, long long w, long long c, long long i) {
  e[++num_edge].from = from;
  e[num_edge].to = to;
  e[num_edge].w = w;
  e[num_edge].c = c;
  e[num_edge].bh = i;
  e[num_edge].nxt = head[from];
  head[from] = num_edge;
}
void kruskal() {
  for (int i = 1; i <= m; ++i) {
    long long uf = find(a[i].from), vf = find(a[i].to);
    if (uf != vf) {
      add(a[i].from, a[i].to, a[i].w, a[i].c, i);
      add(a[i].to, a[i].from, a[i].w, a[i].c, i);
      fa[uf] = vf;
      cnt += a[i].w;
      vise[i] = 1;
      vis_new[i] = 1;
    }
  }
}
void dfs(long long u, long long fa) {
  f[u][0] = fa;
  for (int i = head[u]; i; i = e[i].nxt) {
    long long v = e[i].to;
    if (v == fa)
      continue;
    else {
      depth[v] = depth[u] + 1ll;
      maxm[v][0].dis = e[i].w;
      maxm[v][0].bh = e[i].bh;
      dfs(v, u);
    }
  }
}
void init_lca() {
  for (int i = 1; i <= 25; ++i) {
    for (int j = 1; j <= n; ++j) {
      f[j][i] = f[f[j][i - 1]][i - 1];
      if (maxm[j][i - 1].dis > maxm[f[j][i - 1]][i - 1].dis) {
        maxm[j][i].dis = maxm[j][i - 1].dis;
        maxm[j][i].bh = maxm[j][i - 1].bh;
      } else {
        maxm[j][i].dis = maxm[f[j][i - 1]][i - 1].dis;
        maxm[j][i].bh = maxm[f[j][i - 1]][i - 1].bh;
      }
    }
  }
}
long long get_lca(long long u, long long v) {
  if (depth[u] > depth[v]) swap(u, v);
  for (int i = 25; i >= 0; --i) {
    if (depth[f[v][i]] < depth[u])
      continue;
    else
      v = f[v][i];
  }
  if (u == v) return u;
  for (int i = 25; i >= 0; --i) {
    if (f[v][i] != f[u][i]) {
      v = f[v][i];
      u = f[u][i];
    }
  }
  return f[u][0];
}
node qmax(long long u, long long v) {
  node Ans;
  Ans.bh = -1;
  Ans.dis = -1e18;
  for (int i = 25; i >= 0; --i) {
    if (depth[f[u][i]] >= depth[v]) {
      if (Ans.dis < maxm[u][i].dis) {
        Ans.dis = maxm[u][i].dis;
        Ans.bh = maxm[u][i].bh;
      }
      u = f[u][i];
    }
  }
  return Ans;
}
int main() {
  scanf("%lld%lld", &n, &m);
  for (int i = 1; i <= m; ++i) scanf("%d", &w[i]);
  for (int i = 1; i <= m; ++i) scanf("%d", &c[i]);
  for (int i = 1, u, v; i <= m; ++i) {
    scanf("%d%d", &u, &v);
    a[i].from = u;
    a[i].to = v;
    a[i].w = w[i];
    a[i].c = c[i];
    a[i].bh = i;
  }
  scanf("%lld", &S);
  for (int i = 1; i <= n; ++i) fa[i] = i;
  sort(a + 1, a + m + 1);
  kruskal();
  depth[1] = 1;
  maxm[1][0].dis = -1e18;
  maxm[1][0].bh = e[1].bh;
  dfs(1, 1);
  init_lca();
  ans = 1e18;
  for (int i = 1; i <= m; ++i) {
    long long ww = S / a[i].c;
    if (vise[i]) {
      if (ans > cnt - ww) {
        flag = i;
      }
      ans = min(ans, cnt - ww);
    } else {
      long long u = a[i].from, v = a[i].to;
      long long lca = get_lca(u, v);
      node maxu = qmax(u, lca);
      node maxv = qmax(v, lca);
      if (maxu.dis > maxv.dis) {
        if (ans > cnt - maxu.dis + a[i].w - ww) {
          ans = cnt - maxu.dis + a[i].w - ww;
          vis_new[pre_jia] = 0;
          vis_new[pre_jian] = 1;
          vis_new[i] = 1;
          vis_new[maxu.bh] = 0;
          pre_jia = i;
          pre_jian = maxu.bh;
          flag = i;
        }
      } else {
        if (ans > cnt - maxv.dis + a[i].w - ww) {
          ans = cnt - maxv.dis + a[i].w - ww;
          vis_new[pre_jia] = 0;
          vis_new[pre_jian] = 1;
          vis_new[i] = 1;
          vis_new[maxv.bh] = 0;
          pre_jia = i;
          pre_jian = maxv.bh;
          flag = i;
        }
      }
    }
  }
  if (flag) a[flag].w = a[flag].w - (S / a[flag].c);
  printf("%lld\n", ans);
  for (int i = 1; i <= m; ++i) {
    if (vis_new[i]) {
      printf("%lld %lld\n", a[i].bh, a[i].w);
    }
  }
  return 0;
}
