#include <bits/stdc++.h>
using namespace std;
struct node {
  long long w, c, u, v, id, flag;
} edge[200005];
vector<pair<long long, long long> > G[200005];
long long n, m, S;
long long fa[200005], dep[200005];
long long f[200005][21], w[200005][21];
bool cmp(node x, node y) { return x.w < y.w; }
void makeSet() {
  for (long long i = 1; i <= n; i++) fa[i] = i;
}
long long find(long long x) { return (x == fa[x]) ? x : fa[x] = find(fa[x]); }
void merge(long long x, long long y) {
  long long fx = find(x), fy = find(y);
  fa[fx] = fy;
}
void dfs(long long u, long long fa, long long val) {
  dep[u] = dep[fa] + 1, f[u][0] = fa, w[u][0] = val;
  for (long long i = 1; i <= 20; i++) {
    f[u][i] = f[f[u][i - 1]][i - 1];
    w[u][i] = max(w[u][i - 1], w[f[u][i - 1]][i - 1]);
  }
  for (long long i = 0; i < G[u].size(); i++) {
    long long v = G[u][i].first;
    if (v == fa) continue;
    dfs(v, u, G[u][i].second);
  }
}
long long lca(long long u, long long v, bool opt) {
  long long ans = 0;
  if (dep[u] < dep[v]) swap(u, v);
  for (long long i = 20; ~i; i--)
    if (dep[f[u][i]] >= dep[v]) ans = max(ans, w[u][i]), u = f[u][i];
  if (u == v) {
    if (opt & 1)
      return ans;
    else
      return u;
  }
  for (long long i = 20; ~i; i--)
    if (f[u][i] != f[v][i]) {
      ans = max(ans, w[u][i]);
      ans = max(ans, w[v][i]);
      u = f[u][i], v = f[v][i];
    }
  if (opt & 1)
    return max(ans, max(w[u][0], w[v][0]));
  else
    return f[u][0];
}
bool check(long long x, long long y, long long z) {
  long long x1 = lca(x, y, 0);
  long long x2 = lca(x, z, 0);
  long long x3 = lca(y, z, 0);
  if (x1 == x2 && x3 == z) return 1;
  if (x1 == x3 && x2 == z) return 1;
  return 0;
}
signed main() {
  scanf("%lld %lld", &n, &m);
  makeSet();
  for (long long i = 1; i <= m; i++) scanf("%lld", &edge[i].w);
  for (long long i = 1; i <= m; i++) scanf("%lld", &edge[i].c);
  for (long long i = 1; i <= m; i++) {
    scanf("%d %d", &edge[i].u, &edge[i].v);
    edge[i].id = i;
  }
  scanf("%lld", &S);
  sort(edge + 1, edge + m + 1, cmp);
  long long ans = 0, last = 0, minc = 0x7f7f7f7f;
  for (long long i = 1; i <= m; i++) {
    long long u = find(edge[i].u), v = find(edge[i].v);
    if (u == v) continue;
    if (edge[i].c < minc)
      edge[i].flag = 2, edge[last].flag = 1, last = i;
    else
      edge[i].flag = 1;
    minc = min(minc, edge[i].c);
    ans += edge[i].w;
    merge(edge[i].u, edge[i].v);
    G[edge[i].u].push_back(make_pair(edge[i].v, edge[i].w));
    G[edge[i].v].push_back(make_pair(edge[i].u, edge[i].w));
  }
  long long ans1 = ans, p = 0;
  ans -= S / minc;
  dfs(1, 0, 0);
  for (long long i = 1; i <= m; i++) {
    if (edge[i].flag) continue;
    if (edge[i].c >= minc) continue;
    long long temp = ans1 + edge[i].w - lca(edge[i].u, edge[i].v, 1);
    temp -= S / edge[i].c;
    if (temp < ans) ans = temp, p = i;
  }
  printf("%lld\n", ans);
  if (!p) {
    for (long long i = 1; i <= m; i++)
      if (edge[i].flag == 1)
        printf("%lld %lld\n", edge[i].id, edge[i].w);
      else if (edge[i].flag == 2)
        printf("%lld %lld\n", edge[i].id, edge[i].w - S / minc);
  } else {
    long long u = edge[p].u, v = edge[p].v, w = lca(u, v, 1);
    bool flag = 1;
    for (long long i = 1; i <= m; i++) {
      if (i == p) printf("%lld %lld\n", edge[i].id, edge[i].w - S / edge[i].c);
      if (edge[i].flag) {
        if (flag && edge[i].w == w && check(u, v, edge[i].u) &&
            check(u, v, edge[i].v))
          flag = 0;
        else
          printf("%lld %lld\n", edge[i].id, edge[i].w);
      }
    }
  }
  return 0;
}
