#include <bits/stdc++.h>
using namespace std;
pair<pair<pair<int, int>, pair<int, int> >, int> v[200005];
int n, m, rmq[200005][20 + 1], nr, k, father[200005], weight[200005],
    cost_min = 1000000009;
char viz[200005], mark[200005];
long long scoreT, answer;
pair<int, int> rmq_worse[200005][20 + 1], euler[200005], change;
vector<pair<int, int> > tree[200005];
inline int findFather(int node) {
  if (father[node] == node) return node;
  father[node] = findFather(father[node]);
  return father[node];
}
inline int cmp(const pair<pair<pair<int, int>, pair<int, int> >, int>& a,
               const pair<pair<pair<int, int>, pair<int, int> >, int>& b) {
  if (a.first.second.first == b.first.second.first) {
    if (a.first.second.second == b.first.second.second) return a < b;
    return a.first.second.second < b.first.second.second;
  }
  return a.first.second.first < b.first.second.first;
}
inline void dfs(int node) {
  viz[node] = 1;
  euler[node].first = ++nr;
  for (int i = 1; i <= 20; i++) {
    int nxt = rmq[node][i - 1];
    if (rmq_worse[node][i - 1].first > rmq_worse[nxt][i - 1].first)
      rmq_worse[node][i] = rmq_worse[node][i - 1];
    else
      rmq_worse[node][i] = rmq_worse[nxt][i - 1];
    rmq[node][i] = rmq[nxt][i - 1];
  }
  int lim = tree[node].size();
  for (int i = 0; i < lim; i++) {
    int neight = tree[node][i].first;
    int indx = tree[node][i].second;
    if (!viz[neight]) {
      rmq[neight][0] = node;
      rmq_worse[neight][0] =
          make_pair(v[indx].first.second.first, v[indx].second);
      dfs(neight);
    }
  }
  euler[node].second = nr;
}
inline void preparation() {
  for (int i = 1; i <= m; i++)
    if (mark[v[i].second]) {
      tree[v[i].first.first.first].push_back(
          make_pair(v[i].first.first.second, i));
      tree[v[i].first.first.second].push_back(
          make_pair(v[i].first.first.first, i));
    }
  rmq[1][0] = 1;
  dfs(1);
}
inline int lca(int node1, int node2) {
  if (euler[node1].first <= euler[node2].first &&
      euler[node2].second <= euler[node1].second)
    return node1;
  for (int i = 20; i >= 0; i--) {
    int node = rmq[node1][i];
    if (!(euler[node].first <= euler[node2].first &&
          euler[node2].second <= euler[node].second))
      node1 = node;
  }
  return rmq[node1][0];
}
inline pair<int, int> getWorse(int node1, int node2) {
  pair<int, int> worse = make_pair(0, 0);
  for (int i = 20; i >= 0; i--) {
    int node = rmq[node1][i];
    if (node2 == node) {
      if (rmq_worse[node1][i].first > worse.first) worse = rmq_worse[node1][i];
      return worse;
    }
    if (!(euler[node].first <= euler[node2].first &&
          euler[node2].second <= euler[node].second)) {
      if (rmq_worse[node1][i].first > worse.first) worse = rmq_worse[node1][i];
      node1 = node;
    }
  }
  return worse;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) scanf("%d", &v[i].first.second.first);
  for (int i = 1; i <= m; i++) scanf("%d", &v[i].first.second.second);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &v[i].first.first.first, &v[i].first.first.second);
    v[i].second = i;
  }
  scanf("%d", &k);
  sort(v + 1, v + m + 1, cmp);
  for (int i = 1; i <= n; i++) {
    father[i] = i;
    weight[i] = 1;
  }
  for (int i = 1; i <= m; i++) {
    int f1 = findFather(v[i].first.first.first);
    int f2 = findFather(v[i].first.first.second);
    if (f1 == f2) continue;
    if (weight[f1] > weight[f2]) {
      father[f2] = f1;
      weight[f1] += weight[f2];
    } else {
      father[f1] = f2;
      weight[f2] += weight[f1];
    }
    scoreT += v[i].first.second.first;
    mark[v[i].second] = 1;
    cost_min = min(cost_min, v[i].first.second.second);
  }
  answer = scoreT - k / cost_min;
  long long answer2 = answer;
  preparation();
  for (int i = 1; i <= m; i++) {
    if (mark[v[i].second]) continue;
    int a = v[i].first.first.first;
    int b = v[i].first.first.second;
    int c = lca(a, b);
    assert(c && euler[c].first <= euler[a].first &&
           euler[a].second <= euler[c].second &&
           euler[c].first <= euler[b].first &&
           euler[b].second <= euler[c].second);
    pair<int, int> worse1 = getWorse(a, c);
    pair<int, int> worse2 = getWorse(b, c);
    pair<int, int> worse = (worse1.first > worse2.first ? worse1 : worse2);
    if (scoreT + v[i].first.second.first - worse.first -
            k / v[i].first.second.second <
        answer) {
      answer = scoreT + v[i].first.second.first - worse.first -
               k / v[i].first.second.second;
      change = make_pair(worse.second, v[i].second);
    }
  }
  if (change.first) {
    mark[change.first] = 0;
    mark[change.second] = 1;
  }
  int cost_min = 0;
  for (int i = 1; i <= m; i++) {
    if (!mark[v[i].second]) continue;
    if (cost_min == 0 ||
        v[i].first.second.second < v[cost_min].first.second.second)
      cost_min = i;
  }
  printf("%I64d\n", answer);
  for (int i = 1; i <= m; i++) {
    if (!mark[v[i].second]) continue;
    printf("%d ", v[i].second);
    if (cost_min == i) {
      printf("%d\n", v[i].first.second.first - (k / v[i].first.second.second));
    } else
      printf("%d\n", v[i].first.second.first);
  }
  return 0;
}
