#include <bits/stdc++.h>
using namespace std;
const int NMAX = 2e5 + 7, LG = 19;
long long int tot = 0, w[NMAX], c[NMAX];
int timer, n, m, s, u, v, par[NMAX], sz[NMAX], tin[NMAX], tout[NMAX], vis[NMAX],
    anc[NMAX][LG + 1], spt[NMAX][LG + 1];
std::vector<pair<int, int>> edges, e, adj[NMAX];
set<int> mst;
void init() {
  for (int i = 0; i <= n; i++) {
    sz[i] = 1;
    par[i] = i;
  }
}
int find(int u) {
  if (u == par[u])
    return u;
  else
    return par[u] = find(par[u]);
}
int unite(int u, int v) {
  u = find(u);
  v = find(v);
  if (u == v) return 0;
  if (sz[u] < sz[v]) swap(u, v);
  par[v] = u;
  sz[u] += sz[v];
  return 1;
}
long long int g(int i) { return w[i]; }
void dfs(int v, int par, int pid) {
  tin[v] = timer++;
  anc[v][0] = par;
  spt[v][0] = pid;
  for (int i = 1; i < LG; i++) anc[v][i] = anc[anc[v][i - 1]][i - 1];
  for (int i = 1; i < LG; i++) {
    int fh = spt[v][i - 1], sh = spt[anc[v][i - 1]][i - 1];
    if (g(fh) > g(sh))
      spt[v][i] = fh;
    else
      spt[v][i] = sh;
  }
  for (auto e : adj[v]) {
    int u = e.first, id = e.second;
    if (u != par) dfs(u, v, id);
  }
  tout[v] = timer++;
}
bool is_ancestor(int a, int b) {
  return tin[a] <= tin[b] && tout[b] <= tout[a];
}
int climb(int a, int b) {
  for (int i = LG - 1; i >= 0; i--)
    if (!is_ancestor(anc[a][i], b)) a = anc[a][i];
  return a;
}
int lca(int a, int b) {
  int result = -1;
  if (is_ancestor(a, b))
    return a;
  else if (is_ancestor(b, a))
    return b;
  else
    return anc[climb(a, b)][0];
}
int gm(int lo, int hi) {
  if (lo == hi) {
    return 0;
  }
  int ret = spt[lo][0];
  for (int i = LG - 1; i >= 0; i--) {
    if (!is_ancestor(anc[lo][i], hi)) {
      if (g(ret) < g(spt[lo][i])) ret = spt[lo][i];
      lo = anc[lo][i];
    }
  }
  if (g(ret) < g(spt[lo][0])) ret = spt[lo][0];
  return ret;
}
int getworst(int a, int b) {
  int l = lca(a, b);
  int c1 = gm(a, l);
  int c2 = gm(b, l);
  if (c1 == 0) return c2;
  if (c2 == 0) return c1;
  if (g(c1) > g(c2)) return c1;
  return c2;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  std::cin >> n >> m;
  e.resize(m + 1);
  edges.resize(m + 1);
  init();
  for (int i = 1; i <= m; i++) std::cin >> w[i];
  for (int i = 1; i <= m; i++) std::cin >> c[i];
  c[0] = 1e9;
  for (int i = 1; i <= m; i++) {
    std::cin >> e[i].first >> e[i].second;
    edges[i] = {w[i], i};
  }
  std::cin >> s;
  long long int tinit = 1e17;
  sort(edges.begin(), edges.end());
  for (int i = 1; i <= m; i++) {
    int id = edges[i].second, u = e[id].first, v = e[id].second;
    if (unite(u, v))
      mst.insert(id), tot += w[id], vis[id] = 1, tinit = min(tinit, c[id]);
    if (sz[find(u)] == n) break;
  }
  for (auto i : mst) {
    int u = e[i].first, v = e[i].second;
    adj[u].emplace_back(v, i);
    adj[v].emplace_back(u, i);
  }
  dfs(1, 1, 0);
  long long int res = tot - s / tinit;
  pair<long long int, pair<int, int>> re = {1e18, {-1, -1}};
  for (int i = 1; i <= m; i++) {
    if (vis[i]) {
      re = min(re, {tot - s / c[i], {i, i}});
      continue;
    }
    int u = e[i].first, v = e[i].second;
    int m = getworst(u, v);
    long long int news = tot - w[m] + w[i] - s / c[i];
    re = min(re, {news, {m, i}});
  }
  int to_rem = re.second.first;
  int to_add = re.second.second;
  mst.erase(to_rem);
  mst.insert(to_add);
  long long int mc = 1e15, rere = 0;
  mc = *mst.begin();
  for (int e : mst)
    if (c[e] < c[mc]) mc = e;
  w[mc] -= s / c[mc];
  int flag = 0;
  set<pair<int, int>> ans;
  for (int e : mst) {
    int f, s;
    f = e;
    s = w[e];
    rere += s;
    ans.insert({f, s});
  }
  std::cout << rere << '\n';
  for (auto e : ans) std::cout << e.first << ' ' << e.second << '\n';
}
