#include <bits/stdc++.h>
using namespace std;
template <typename Arg1>
void __f(const char *name, Arg1 &&arg1) {
  std::cerr << name << " : " << arg1 << endl;
}
template <typename Arg1, typename... Args>
void __f(const char *names, Arg1 &&arg1, Args &&...args) {
  const char *comma = strchr(names + 1, ',');
  std::cerr.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}
const long long hell = LLONG_MAX;
long long maxx(long long a, long long b, vector<long long> &w) {
  if (w[a] < w[b])
    return b;
  else
    return a;
}
struct LCA {
  vector<long long> tin, tout;
  long long timer;
  long long l;
  vector<vector<long long>> up;
  vector<vector<long long>> vw;
  LCA(vector<vector<pair<long long, long long>>> &v, vector<long long> &w,
      vector<long long> &c) {
    long long n = v.size() - 1;
    tin.assign(n + 1, 0);
    tout.assign(n + 1, 0);
    timer = 0;
    l = ceil(log2(n + 1));
    up.assign(n + 1, vector<long long>(l + 1, 0));
    vw.assign(n + 1, vector<long long>(l + 1, 0));
    dfs(v, w, 1, 1, 0);
  }
  void dfs(vector<vector<pair<long long, long long>>> &v, vector<long long> &w,
           long long cur, long long par, long long ed) {
    tin[cur] = ++timer;
    up[cur][0] = par;
    vw[cur][0] = ed;
    for (long long i = 1; i <= l; i++) up[cur][i] = up[up[cur][i - 1]][i - 1];
    for (long long i = 1; i <= l; i++)
      vw[cur][i] = maxx(vw[cur][i - 1], vw[up[cur][i - 1]][i - 1], w);
    for (auto x : v[cur]) {
      if (x.first != par) dfs(v, w, x.first, cur, x.second);
    }
    tout[cur] = ++timer;
  }
  bool is_ans(long long u, long long v) {
    return tin[u] <= tin[v] && tout[u] >= tout[v];
  }
  long long query(long long u, long long v, vector<long long> &w) {
    if (is_ans(u, v)) return 0;
    long long ans = 0;
    for (long long i = l; i >= 0; i--) {
      if (!is_ans(up[u][i], v)) {
        ans = maxx(ans, vw[u][i], w);
        u = up[u][i];
      }
    }
    return maxx(ans, vw[u][0], w);
  }
};
signed solve() {
  long long n;
  cin >> n;
  long long m;
  cin >> m;
  vector<long long> w(m + 1), c(m + 1);
  for (long long i = 1; i <= m; i++) cin >> w[i];
  for (long long i = 1; i <= m; i++) cin >> c[i];
  vector<vector<pair<long long, long long>>> v(
      n + 1, vector<pair<long long, long long>>());
  vector<pair<long long, long long>> edges(m + 1);
  for (long long i = 1; i <= m; i++) {
    long long a, b;
    cin >> a >> b;
    v[a].push_back({b, i});
    v[b].push_back({a, i});
    edges[i] = {a, b};
  }
  long long s;
  cin >> s;
  vector<long long> mp(n + 1, 0);
  set<pair<long long, long long>> st;
  mp[1ll] = 0;
  st.insert({0, 1});
  vector<long long> mst(m + 1);
  for (long long i = 0; i < n; i++) {
    auto cur = *(st.begin());
    st.erase(cur);
    mst[mp[cur.second]] = 1;
    mp[cur.second] = -1;
    for (auto ver_ind : v[cur.second]) {
      long long ver = ver_ind.first;
      long long ind = ver_ind.second;
      if (mp[ver] == 0 || (mp[ver] != -1) && (w[ind] < w[mp[ver]])) {
        auto itr = st.find({w[mp[ver]], ver});
        if (itr != st.end()) st.erase(itr);
        mp[ver] = ind;
        st.insert({w[ind], ver});
      }
    }
  }
  vector<vector<pair<long long, long long>>> a(
      n + 1, vector<pair<long long, long long>>());
  for (long long i = 1; i <= m; i++) {
    if (mst[i] == 1) {
      long long x = edges[i].first;
      long long y = edges[i].second;
      a[x].push_back({y, i});
      a[y].push_back({x, i});
    }
  }
  LCA lca(a, w, c);
  long long sm = 0;
  long long mn = hell;
  long long del = 0;
  long long add = 0;
  for (long long i = 1; i <= m; i++) {
    if (mst[i] == 0) {
      long long a = edges[i].first;
      long long b = edges[i].second;
      long long l1 = lca.query(a, b, w);
      long long l2 = lca.query(b, a, w);
      long long mnn = maxx(l1, l2, w);
      long long curw = w[i] - s / c[i] - w[mnn];
      if (curw < mn) {
        mn = w[i] - s / c[i] - w[mnn];
        del = mnn;
        add = i;
      }
    } else {
      sm += w[i];
      if (-(s / c[i]) < mn) {
        mn = -s / c[i];
        del = 0;
        add = i;
      }
    }
  }
  cout << sm + mn << endl;
  for (long long i = 1; i <= m; i++) {
    if (mst[i] == 1) {
      long long curw;
      if (del == i) {
        cout << add << " ";
        curw = w[add] - s / c[add];
      } else {
        cout << i << " ";
        curw = w[i];
      }
      if (i == add) {
        curw -= (s / c[i]);
      }
      cout << curw << endl;
    }
  }
  return 0;
}
signed main() {
  long long t = 1;
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  while (t--) {
    solve();
  }
  return 0;
}
