#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 5;
int n, m;
struct edge {
  int u, v, w, c, id;
} e[N], mst[N];
bool cmp(edge a, edge b) { return a.w < b.w; }
long long sum = 0;
int fa[N], mstid[N];
bool ismst[N];
int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }
int bel[N][21], deep[N];
pair<int, int> mx[N][21];
int target[N], pre[N], last[N], w[N], ind[N], tot = 0, s;
long long mstmn = 1e18 + 5, ans = 1e18 + 5;
int mstmnid;
int change[2];
void add(int u, int v, int ww, int id) {
  target[++tot] = v;
  pre[tot] = last[u];
  last[u] = tot;
  w[tot] = ww;
  ind[tot] = id;
}
void dfs(int u, int fa, int id, int ww) {
  bel[u][0] = fa;
  mx[u][0] = make_pair(ww, id);
  deep[u] = deep[fa] + 1;
  for (int i = (1); i <= (20); ++i) bel[u][i] = bel[bel[u][i - 1]][i - 1];
  for (int i = (1); i <= (20); ++i)
    mx[u][i] = max(mx[u][i - 1], mx[bel[u][i - 1]][i - 1]);
  for (int ptr = last[u]; ptr; ptr = pre[ptr]) {
    int v = target[ptr];
    if (v == fa) continue;
    dfs(v, u, ind[ptr], w[ptr]);
  }
}
pair<int, int> query(int u, int v) {
  pair<int, int> mxx = make_pair(-1, 0);
  if (deep[u] < deep[v]) swap(u, v);
  for (int i = (20); i >= (0); --i)
    if (deep[bel[u][i]] >= deep[v]) {
      mxx = max(mxx, mx[u][i]);
      u = bel[u][i];
    }
  if (u == v) return mxx;
  for (int i = (20); i >= (0); --i)
    if (bel[u][i] != bel[v][i]) {
      mxx = max(mxx, max(mx[u][i], mx[v][i]));
      u = bel[u][i];
      v = bel[v][i];
    }
  mxx = max(mxx, max(mx[u][0], mx[v][0]));
  return mxx;
}
signed 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);
  for (int i = (1); i <= (m); ++i) e[i].id = i;
  scanf("%d", &s);
  for (int i = (1); i <= (n); ++i) fa[i] = i;
  sort(e + 1, e + m + 1, cmp);
  int now = 0;
  for (int i = (1); i <= (m); ++i) {
    int x = find(e[i].u), y = find(e[i].v);
    if (x != y) {
      mst[++now].u = e[i].u;
      mst[now].v = e[i].v;
      mst[now].w = e[i].w;
      mst[now].c = e[i].c;
      mstid[now] = i;
      mst[now].id = e[i].id;
      ismst[i] = 1;
      sum += e[i].w;
      fa[x] = y;
    }
    if (now == n - 1) break;
  }
  for (int i = (1); i <= (now); ++i) {
    add(mst[i].u, mst[i].v, mst[i].w, mstid[i]);
    add(mst[i].v, mst[i].u, mst[i].w, mstid[i]);
    if (mst[i].c < mstmn) mstmnid = i, mstmn = mst[i].c;
  }
  ans = min(ans, sum - s / mstmn);
  dfs(1, 0, 0, 0);
  for (int i = (1); i <= (m); ++i) {
    if (!ismst[i]) {
      int u = e[i].u, v = e[i].v, w = e[i].w, c = e[i].c;
      w -= s / c;
      pair<int, int> mxl = query(u, v);
      int id = mxl.second;
      if (w < e[id].w && ans > sum - e[id].w + w) {
        change[0] = id;
        change[1] = i;
        ans = sum - e[id].w + w;
      }
    }
  }
  printf("%lld\n", ans);
  if (!change[0]) {
    for (int i = (1); i <= (now); ++i) {
      printf("%d %d\n", mst[i].id,
             (i == mstmnid) ? (mst[i].w - s / mst[i].c) : mst[i].w);
    }
  } else {
    for (int i = (1); i <= (now); ++i) {
      if (change[0] == mstid[i])
        printf("%d %d\n", e[change[1]].id, e[change[1]].w - s / e[change[1]].c);
      else
        printf("%d %d\n", mst[i].id, mst[i].w);
    }
  }
  return 0;
}
