#include <bits/stdc++.h>
using namespace std;
double safe_sqrt(double x) { return sqrt(max((double)0.0, x)); }
long long GI(long long& x) { return scanf("%lld", &x); }
const long long MN = 200111;
struct Edge {
  long long u, v;
  long long w, c;
  long long id;
} e[MN];
bool operator<(const Edge& a, const Edge& b) { return a.w < b.w; }
long long lab[MN];
struct DSU {
  void init(long long n) {
    for (long long i = 0, _a = (n + 1); i < _a; ++i) lab[i] = -1;
  }
  long long getRoot(long long u) {
    if (lab[u] < 0) return u;
    return lab[u] = getRoot(lab[u]);
  }
  bool merge(long long u, long long v) {
    u = getRoot(u);
    v = getRoot(v);
    if (u == v) return false;
    if (lab[u] > lab[v]) swap(u, v);
    lab[u] += lab[v];
    lab[v] = u;
    return true;
  }
};
long long inMst[MN];
long long n, m;
vector<pair<long long, long long> > ke[MN];
long long h[MN];
long long father[20][MN];
pair<long long, long long> ln[20][MN];
void addEdge(long long u, long long v, long long id) {
  ke[u].emplace_back(v, id);
  ke[v].emplace_back(u, id);
}
void dfs(long long u, long long fu) {
  for (auto p : ke[u]) {
    long long v = p.first;
    if (v == fu) continue;
    h[v] = h[u] + 1;
    father[0][v] = u;
    long long i = p.second;
    ln[0][v] = make_pair(e[i].w, i);
    dfs(v, u);
  }
}
void initLCA() {
  for (long long t = (1), _b = (19); t <= _b; ++t) {
    for (long long u = (1), _b = (n); u <= _b; ++u) {
      long long v = father[t - 1][u];
      father[t][u] = father[t - 1][v];
      ln[t][u] = max(ln[t - 1][u], ln[t - 1][v]);
    }
  }
}
pair<long long, long long> getMax(long long u, long long v) {
  pair<long long, long long> res = make_pair(-1, 0);
  if (h[u] < h[v]) swap(u, v);
  if (h[u] > h[v]) {
    for (long long t = (19), _b = (0); t >= _b; --t) {
      long long x = father[t][u];
      if (h[x] >= h[v]) {
        res = max(res, ln[t][u]);
        u = father[t][u];
      }
    }
  }
  if (u == v) return res;
  for (long long t = (19), _b = (0); t >= _b; --t) {
    if (father[t][u] != father[t][v]) {
      res = max(res, ln[t][u]);
      res = max(res, ln[t][v]);
      u = father[t][u];
      v = father[t][v];
    }
  }
  res = max(res, ln[0][u]);
  res = max(res, ln[0][v]);
  return res;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout << (fixed) << setprecision(9);
  while (GI(n) == 1 && GI(m) == 1) {
    for (long long i = (1), _b = (n); i <= _b; ++i) ke[i].clear();
    for (long long i = (1), _b = (m); i <= _b; ++i) GI(e[i].w);
    for (long long i = (1), _b = (m); i <= _b; ++i) GI(e[i].c);
    for (long long i = (1), _b = (m); i <= _b; ++i) {
      GI(e[i].u);
      GI(e[i].v);
      e[i].id = i;
    }
    long long S;
    GI(S);
    sort(e + 1, e + m + 1);
    DSU dsu;
    dsu.init(n + 1);
    long long sumw = 0;
    long long minc = 1000111000;
    memset(inMst, 0, sizeof inMst);
    for (long long i = (1), _b = (m); i <= _b; ++i) {
      long long u = dsu.getRoot(e[i].u);
      long long v = dsu.getRoot(e[i].v);
      if (u != v) {
        dsu.merge(u, v);
        minc = min(minc, e[i].c);
        sumw += e[i].w;
        inMst[i] = 1;
        addEdge(e[i].u, e[i].v, i);
      }
    }
    long long res = sumw - (S / minc);
    long long removeEdge = -1;
    long long addedEdge = -1;
    long long minEdge = -1;
    h[1] = 1;
    memset(father, 0, sizeof father);
    dfs(1, -1);
    initLCA();
    for (long long i = (1), _b = (m); i <= _b; ++i)
      if (!inMst[i] && e[i].c < minc) {
        long long u = e[i].u, v = e[i].v;
        auto rem = getMax(u, v);
        long long cur = sumw - rem.first + e[i].w;
        cur -= S / e[i].c;
        if (cur < res) {
          res = cur;
          addedEdge = i;
          removeEdge = rem.second;
        }
      }
    for (long long i = (1), _b = (m); i <= _b; ++i) {
      if (i == addedEdge || (inMst[i] && !(removeEdge == i))) {
        if (minEdge < 0 || e[i].c < e[minEdge].c) {
          minEdge = i;
        }
      }
    }
    printf("%lld\n", res);
    for (long long i = (1), _b = (m); i <= _b; ++i) {
      if (i == addedEdge || (inMst[i] && !(removeEdge == i))) {
        printf("%lld ", e[i].id);
        if (i == minEdge) {
          e[i].w -= S / e[i].c;
        }
        printf("%lld\n", e[i].w);
      }
    }
  }
}
