#include <bits/stdc++.h>
using namespace std;
int n, m, s;
int weight[200005];
int cost[200005];
vector<tuple<int, int, int, int>> edges, sortedEdges;
bool selected[200005];
vector<pair<int, int>> tree[200005];
int djp[200005];
int getp(int p) { return p == djp[p] ? p : (djp[p] = getp(djp[p])); }
void merge(int a, int b) { djp[getp(a)] = getp(b); }
const int MAXLN = 18;
int parent[MAXLN][200005];
pair<int, int> maxedge[MAXLN][200005];
int depth[200005];
void dfs(int u, int par) {
  for (const auto& e : tree[u]) {
    if (e.first == par) {
      continue;
    }
    depth[e.first] = depth[u] + 1;
    parent[0][e.first] = u;
    maxedge[0][e.first] = {get<0>(edges[e.second]), e.second};
    dfs(e.first, u);
  }
}
pair<int, int> lcamaxedge(int u, int v) {
  pair<int, int> ret{-1, -1};
  if (depth[u] < depth[v]) {
    swap(u, v);
  }
  if (depth[u] > depth[v]) {
    for (int i = MAXLN - 1; i >= 0; --i) {
      if (depth[u] - (1 << i) >= depth[v]) {
        ret = max(ret, maxedge[i][u]);
        u = parent[i][u];
      }
    }
  }
  if (u == v) {
    return ret;
  }
  for (int i = MAXLN - 1; i >= 0; --i) {
    if (parent[i][u] != parent[i][v]) {
      ret = max(ret, maxedge[i][u]);
      u = parent[i][u];
      ret = max(ret, maxedge[i][v]);
      v = parent[i][v];
    }
  }
  ret = max(ret, maxedge[0][u]);
  u = parent[0][u];
  ret = max(ret, maxedge[0][v]);
  v = parent[0][v];
  return ret;
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    djp[i] = i;
  }
  for (int i = 0; i < m; ++i) {
    scanf("%d", &weight[i]);
  }
  for (int i = 0; i < m; ++i) {
    scanf("%d", &cost[i]);
  }
  for (int i = 0; i < m; ++i) {
    int a, b;
    scanf("%d %d", &a, &b);
    edges.emplace_back(weight[i], a, b, i);
  }
  scanf("%d", &s);
  sortedEdges = edges;
  sort(sortedEdges.begin(), sortedEdges.end());
  long long mst = 0;
  for (const auto& e : sortedEdges) {
    int c, a, b, eid;
    tie(c, a, b, eid) = e;
    if (getp(a) != getp(b)) {
      merge(a, b);
      tree[a].push_back({b, eid});
      tree[b].push_back({a, eid});
      mst += c;
      selected[eid] = true;
    }
  }
  parent[0][1] = 1;
  dfs(1, -1);
  for (int i = 1; i < MAXLN; ++i) {
    for (int j = 1; j <= n; ++j) {
      parent[i][j] = parent[i - 1][parent[i - 1][j]];
      maxedge[i][j] = max(maxedge[i - 1][j], maxedge[i - 1][parent[i - 1][j]]);
    }
  }
  long long ans = mst;
  int reducedEID = -1, replacedEID = -1;
  long long reducedVal = 0;
  for (int i = 0; i < m; ++i) {
    long long available = (long long)s / (long long)cost[i];
    long long reducedWeight = weight[i] - available;
    if (selected[i]) {
      if (ans > mst - available) {
        ans = mst - available;
        reducedEID = i;
        replacedEID = -1;
        reducedVal = reducedWeight;
      }
    } else {
      int a = get<1>(edges[i]);
      int b = get<2>(edges[i]);
      pair<int, int> lcamax = lcamaxedge(a, b);
      if (lcamax.first > reducedWeight) {
        long long newval = mst - lcamax.first + reducedWeight;
        if (ans > newval) {
          ans = newval;
          reducedEID = i;
          replacedEID = lcamax.second;
          reducedVal = reducedWeight;
        }
      }
    }
  }
  printf("%lld\n", ans);
  if (replacedEID == -1) {
    for (int i = 0; i < m; ++i) {
      if (i == reducedEID) {
        printf("%d %lld\n", i + 1, reducedVal);
      } else if (selected[i]) {
        printf("%d %d\n", i + 1, weight[i]);
      }
    }
  } else {
    for (int i = 0; i < m; ++i) {
      if (i == reducedEID) {
        printf("%d %lld\n", i + 1, reducedVal);
      } else if (i == replacedEID) {
        continue;
      } else if (selected[i]) {
        printf("%d %d\n", i + 1, weight[i]);
      }
    }
  }
  return 0;
}
