#include <bits/stdc++.h>
using namespace std;
long long n, m, x, y, z, c, L[200100], T[200100], P[200100][20],
    mst = 0, dsuP[200100], dsuR[200100] = {0};
long long cost[200100], costP[200100][20];
vector<pair<long long, long long> > graph[200100];
vector<pair<long long, pair<long long, long long> > > edge, query;
long long findSet(long long x) {
  return x == dsuP[x] ? x : dsuP[x] = findSet(dsuP[x]);
}
bool isSameSet(long long x, long long y) {
  return findSet(x) == findSet(y) ? true : false;
}
void dfs(long long u, long long lvl, long long p) {
  T[u] = p;
  L[u] = lvl;
  for (int i = 0; i < graph[u].size(); i++) {
    int v = graph[u][i].first;
    if (v == p) continue;
    cost[v] = graph[u][i].second;
    dfs(v, lvl + 1, u);
  }
}
void build() {
  for (int i = 0; i < n; i++) {
    for (int j = 0; (1 << j) < n; j++) {
      P[i][j] = -1;
    }
  }
  for (int i = 0; i < n; i++) P[i][0] = T[i];
  for (int j = 1; (1 << j) < n; j++) {
    for (int i = 0; i < n; i++) {
      if (P[i][j - 1] != -1) P[i][j] = P[P[i][j - 1]][j - 1];
    }
  }
}
void build_max() {
  for (int i = 0; i < n; i++) costP[i][0] = cost[i];
  for (int j = 1; (1 << j) < n; j++) {
    for (int i = 0; i < n; i++) {
      if (P[i][j - 1] != -1)
        costP[i][j] = max(costP[i][j - 1], costP[P[i][j - 1]][j - 1]);
    }
  }
}
long long lca(long long u, long long v) {
  long long ret = 0;
  if (L[u] < L[v]) swap(u, v);
  long long log;
  for (log = 1; (1 << log) <= L[u]; log++)
    ;
  log--;
  for (int i = log; i >= 0; i--) {
    if (L[u] - (1 << i) >= L[v]) {
      ret = max(ret, costP[u][i]);
      u = P[u][i];
    }
  }
  if (u == v) return ret;
  for (int i = log; i >= 0; i--) {
    if (P[u][i] != -1 && P[u][i] != P[v][i]) {
      ret = max(ret, max(costP[u][i], costP[v][i]));
      u = P[u][i];
      v = P[v][i];
    }
  }
  return max(ret, max(cost[u], cost[v]));
}
int main() {
  long long w[200100], costt[200100];
  scanf("%I64d %I64d", &n, &m);
  n++;
  for (int i = 0; i < n; i++) {
    dsuP[i] = i;
  }
  for (int i = 0; i < m; i++) {
    scanf("%I64d", &w[i]);
  }
  for (int i = 0; i < m; i++) {
    scanf("%I64d", &costt[i]);
  }
  for (int i = 0; i < m; i++) {
    scanf("%I64d %I64d", &x, &y);
    x--, y--;
    z = w[i];
    edge.push_back(make_pair(z, make_pair(x, y)));
  }
  query = edge;
  sort(edge.begin(), edge.end());
  for (int i = 0; i < edge.size(); i++) {
    x = edge[i].second.first;
    y = edge[i].second.second;
    c = edge[i].first;
    if (!isSameSet(x, y)) {
      int a = findSet(x);
      int b = findSet(y);
      if (dsuR[a] >= dsuR[b]) {
        dsuP[b] = a;
        if (dsuR[a] == dsuR[b]) dsuR[a] = dsuR[b] + 1;
      } else
        dsuP[a] = b;
      graph[x].push_back(make_pair(y, c));
      graph[y].push_back(make_pair(x, c));
      mst += c;
    }
  }
  cost[0] = 0;
  dfs(0, 0, 0);
  build();
  build_max();
  long long ans = 1e18, budget, reduce, idx;
  scanf("%I64d", &budget);
  for (int i = 0; i < m; i++) {
    x = query[i].second.first;
    y = query[i].second.second;
    z = lca(x, y);
    reduce = budget / costt[i];
    if (mst - z + w[i] - reduce < ans) {
      ans = mst - z + w[i] - reduce;
      idx = i;
    }
  }
  printf("%lld\n", ans);
  vector<pair<long long, pair<long long, pair<long long, long long> > > > path;
  for (int i = 0; i < m; i++) {
    if (i == idx) continue;
    x = query[i].second.first;
    y = query[i].second.second;
    path.push_back(make_pair(query[i].first, make_pair(i, make_pair(x, y))));
  }
  for (int i = 0; i < n; i++) {
    dsuP[i] = i;
    dsuR[i] = 1;
  }
  sort(path.begin(), path.end());
  reduce = budget / costt[idx];
  path.insert(path.begin(),
              make_pair(w[idx] - reduce,
                        make_pair(idx, make_pair(query[idx].second.first,
                                                 query[idx].second.second))));
  for (int i = 0; i < path.size(); i++) {
    x = path[i].second.second.first;
    y = path[i].second.second.second;
    c = path[i].first;
    idx = path[i].second.first;
    if (!isSameSet(x, y)) {
      int a = findSet(x);
      int b = findSet(y);
      if (dsuR[a] >= dsuR[b]) {
        dsuP[b] = a;
        if (dsuR[a] == dsuR[b]) dsuR[a] = dsuR[b] + 1;
      } else
        dsuP[a] = b;
      printf("%lld %lld\n", idx + 1, c);
      mst += c;
    }
  }
  return 0;
}
