#include <bits/stdc++.h>
using namespace std;
int n, m, w[200001], c[200001], s, dsu[200001], nd, ndv, res[200001];
long long sum;
pair<int, int> edge[200001];
priority_queue<tuple<int, int, int> > pq;
struct lca_util {
  int d[200001];
  vector<int> p[200001], f[200001];
  vector<pair<int, int> > g[200001];
  int wmax(int i, int j) {
    if (!i) return j;
    if (!j) return i;
    if (w[i] > w[j]) return i;
    return j;
  }
  void init(int u, int prev) {
    for (auto v : g[u])
      if (v.first != prev) {
        d[v.first] = d[u] + 1;
        p[v.first].push_back(u);
        f[v.first].push_back(v.second);
        for (int j = 1; j - 1 < p[p[v.first][j - 1]].size(); j++) {
          p[v.first].push_back(p[p[v.first][j - 1]][j - 1]);
          f[v.first].push_back(
              wmax(f[v.first][j - 1], f[p[v.first][j - 1]][j - 1]));
        }
        init(v.first, u);
      }
  }
  int parent(int v, int c) {
    if (!c) return v;
    while (c) v = p[v][__builtin_ctz(c)], c -= 1 << __builtin_ctz(c);
    return v;
  }
  int lca(int u, int v) {
    if (u == v) return u;
    int l = 1, r = d[u], mid;
    while (l < r) {
      mid = (l + r) / 2;
      if (parent(u, mid) == parent(v, mid))
        r = mid;
      else
        l = mid + 1;
    }
    return parent(u, l);
  }
  int get(int v, int c) {
    if (!c) return 0;
    int mx = 0;
    while (c) {
      if (!mx or w[f[v][__builtin_ctz(c)]] > w[mx]) mx = f[v][__builtin_ctz(c)];
      v = p[v][__builtin_ctz(c)];
      c -= 1 << __builtin_ctz(c);
    }
    return mx;
  }
  int find_max(int u, int v) {
    int mx = 0;
    if (d[u] > d[v]) mx = get(u, d[u] - d[v]), u = parent(u, d[u] - d[v]);
    if (d[v] > d[u]) mx = get(v, d[v] - d[u]), v = parent(v, d[v] - d[u]);
    mx = wmax(wmax(get(u, d[u] - d[lca(u, v)]), get(v, d[v] - d[lca(u, v)])),
              mx);
    return mx;
  }
} lca_util;
int root(int v) { return (dsu[v] < 0 ? v : dsu[v] = root(dsu[v])); }
void merge(int i) {
  int u = root(edge[i].first), v = root(edge[i].second);
  if (u == v) return;
  if (dsu[u] < dsu[v]) swap(u, v);
  dsu[v] += dsu[v];
  dsu[v] = u;
  lca_util.g[edge[i].first].emplace_back(edge[i].second, i);
  lca_util.g[edge[i].second].emplace_back(edge[i].first, i);
  res[i] = w[i];
}
int main() {
  scanf("%d%d", &n, &m);
  fill(dsu + 1, dsu + n + 1, -1);
  fill(res + 1, res + m + 1, INT_MAX);
  for (int i = 1; i <= m; i++) scanf("%d", w + i);
  for (int i = 1; i <= m; i++) scanf("%d", c + i);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &edge[i].first, &edge[i].second);
    pq.emplace(-w[i], -c[i], i);
  }
  while (!pq.empty()) merge(get<2>(pq.top())), pq.pop();
  scanf("%d", &s);
  lca_util.init(1, -1);
  for (int i = 1; i <= m; i++) {
    int mx = lca_util.find_max(edge[i].first, edge[i].second);
    if (w[mx] - (w[i] - s / c[i]) >= ndv)
      nd = i, ndv = w[mx] - (w[i] - s / c[i]);
  }
  int mx = lca_util.find_max(edge[nd].first, edge[nd].second);
  res[mx] = INT_MAX;
  res[nd] = w[nd] - s / c[nd];
  for (int i = 1; i <= m; i++)
    if (res[i] != INT_MAX) sum += res[i];
  printf("%lld\n", sum);
  for (int i = 1; i <= m; i++)
    if (res[i] != INT_MAX) printf("%d %d\n", i, res[i]);
}
