#include <bits/stdc++.h>
using namespace std;
const bool dbg = 0;
long long w[300005], c[300005];
int edges[300005][2];
vector<pair<int, int> > adj[300005];
vector<vector<int> > mst;
bool visited[300005];
int parent[300005];
struct lca {
  int L, N;
  vector<int> depth, size, link, linkm;
  lca() {}
  lca(const vector<vector<int> > &graph, int root = 0) {
    if (dbg) cout << "in lca 0" << endl;
    N = graph.size();
    for (L = 0; (1 << L) <= N; L++)
      ;
    depth.resize(N);
    size.resize(N);
    link.resize(L * N);
    linkm.resize(L * N);
    if (dbg) cout << "in lca 1" << endl;
    init(root, root, graph);
  }
  void init(int loc, int par, const vector<vector<int> > &graph) {
    if (dbg) cout << "init(" << loc << ", " << par << ")" << endl;
    link[loc] = par;
    linkm[loc] = parent[loc];
    for (int l = 1; l < L; l++) {
      if (w[linkm[(l - 1) * N + loc]] <
          w[linkm[(l - 1) * N + link[(l - 1) * N + loc]]])
        linkm[l * N + loc] = linkm[(l - 1) * N + link[(l - 1) * N + loc]];
      else
        linkm[l * N + loc] = linkm[(l - 1) * N + loc];
      link[l * N + loc] = link[(l - 1) * N + link[(l - 1) * N + loc]];
    }
    for (int nbr : graph[loc]) {
      if (nbr == par) continue;
      depth[nbr] = depth[loc] + 1;
      init(nbr, loc, graph);
      size[loc] += size[nbr];
    }
    size[loc]++;
  }
  int above(int loc, int dist) {
    for (int l = 0; l < L; l++)
      if ((dist >> l) & 1) loc = link[l * N + loc];
    return loc;
  }
  int abovem(int loc, int dist) {
    int m = linkm[loc];
    for (int l = 0; l < L; l++) {
      if ((dist >> l) & 1) {
        if (w[m] < w[linkm[l * N + loc]]) m = linkm[l * N + loc];
        loc = link[l * N + loc];
      }
    }
    return m;
  }
  int find_max(int u, int v) {
    if (dbg) cout << "find_max(" << u << ", " << v << ")" << endl;
    if (depth[u] > depth[v]) swap(u, v);
    int m = abovem(v, depth[v] - depth[u]);
    v = above(v, depth[v] - depth[u]);
    if (u == v) {
      if (dbg) cout << "0 " << u << endl;
      return m;
    }
    for (int l = L - 1; l >= 0; l--) {
      if (link[l * N + u] != link[l * N + v]) {
        if (w[m] < w[linkm[l * N + u]]) m = linkm[l * N + u];
        if (w[m] < w[linkm[l * N + v]]) m = linkm[l * N + v];
        u = link[l * N + u], v = link[l * N + v];
      }
    }
    if (u == v) {
      if (dbg) cout << "1 " << u << endl;
      return m;
    }
    if (dbg) cout << "2 " << link[u] << endl;
    if (dbg)
      cout << m << " <=> " << u << ">" << linkm[u] << " " << v << ">"
           << linkm[v] << endl;
    if (w[m] < w[linkm[u]]) m = linkm[u];
    if (w[m] < w[linkm[v]]) m = linkm[v];
    return m;
  }
};
struct union_find {
  vector<int> P, S;
  union_find(int N) {
    P.resize(N), S.resize(N, 1);
    for (int i = 0; i < N; i++) P[i] = i;
  }
  int rep(int i) { return (P[i] == i) ? i : P[i] = rep(P[i]); }
  bool merge(int a, int b) {
    a = rep(a), b = rep(b);
    if (a == b) return false;
    P[b] = a;
    S[a] += S[b];
    return true;
  }
};
void recur(int root) {
  if (dbg) cout << "recur: " << root << endl;
  if (visited[root]) return;
  visited[root] = true;
  if (dbg) cout << "children... " << endl;
  for (auto e : adj[root]) {
    if (dbg) cout << e.first << endl;
    if (!visited[e.first]) {
      mst[root].push_back(e.first);
      parent[e.first] = e.second;
      recur(e.first);
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout.precision(15);
  int n, m, S, a, b;
  cin >> n >> m;
  mst.resize(n);
  for (int i = 1; i <= m; i++) cin >> w[i];
  for (int i = 1; i <= m; i++) cin >> c[i];
  for (int i = 1; i <= m; i++) {
    cin >> a >> b;
    edges[i][0] = a - 1;
    edges[i][1] = b - 1;
  }
  cin >> S;
  if (dbg) cout << "MST..." << endl;
  set<int> mst_edges;
  union_find uf(n + 1);
  priority_queue<pair<long long, int> > pq;
  for (int i = 1; i <= m; i++) pq.push({-w[i], i});
  while (!pq.empty()) {
    int edge = pq.top().second;
    pq.pop();
    if (uf.merge(edges[edge][0], edges[edge][1])) {
      mst_edges.insert(edge);
    }
  }
  if (dbg) cout << "MST2..." << endl;
  long long total_cost = 0;
  for (auto e : mst_edges) {
    if (dbg) {
      cout << e << endl;
    }
    total_cost += w[e];
    if (dbg) cout << "a" << endl;
    adj[edges[e][0]].push_back({edges[e][1], e});
    if (dbg) cout << "a" << endl;
    adj[edges[e][1]].push_back({edges[e][0], e});
    if (dbg) cout << "a" << endl;
  }
  if (dbg) cout << "Recur..." << endl;
  recur(0);
  if (dbg) cout << "LCA..." << endl;
  lca mst_lca(mst, 0);
  if (dbg) cout << "Go through edges..." << endl;
  long long best_save = 0;
  int reduce_road = 0;
  int replace_road = 0;
  for (int i = 1; i <= m; i++) {
    if (mst_edges.find(i) != mst_edges.end()) {
      if (dbg) cout << i << " is in the MST." << endl;
      long long savings = S / c[i];
      if (savings > best_save) {
        if (dbg) cout << "\tSaves: " << savings << endl;
        best_save = savings;
        reduce_road = i;
      }
    } else {
      if (dbg) cout << i << " is NOT in the MST." << endl;
      int roadx = mst_lca.find_max(edges[i][0], edges[i][1]);
      long long savings = w[roadx] - w[i] + S / c[i];
      if (savings > best_save) {
        if (dbg)
          cout << "\tSaves: " << savings << " (" << roadx << " " << w[roadx]
               << ")" << endl;
        best_save = savings;
        reduce_road = i;
        replace_road = roadx;
      }
    }
  }
  if (dbg) cout << "Ending..." << endl;
  cout << total_cost - best_save << endl;
  if (reduce_road == 0) {
    for (auto e : mst_edges) cout << e << " " << w[e] << endl;
  } else {
    if (mst_edges.find(reduce_road) != mst_edges.end()) {
      for (auto e : mst_edges) {
        if (e == reduce_road)
          cout << e << " " << w[e] - S / c[e] << endl;
        else
          cout << e << " " << w[e] << endl;
      }
    } else {
      cout << reduce_road << " " << w[reduce_road] - S / c[reduce_road] << endl;
      for (auto e : mst_edges) {
        if (e == replace_road)
          continue;
        else
          cout << e << " " << w[e] << endl;
      }
    }
  }
  return 0;
}
