#include <bits/stdc++.h>
int n, m, s, d0, sz, first[400010], next[400010], tail[400010], num[400010],
    a[200010], b[200010], w[200010], c[200010], ind[200010], q[200010],
    dep[200010], par[200010][20], max[200010][20], fat[200010], stk[200010],
    use[200010];
void addedge(int u, int v, int k);
void sort(int l, int r);
void swap(int i, int j);
void bfs(int u0);
int find(int k);
int query(int u, int v);
int main(void) {
  scanf("%d%d", &n, &m);
  int i;
  for (i = 1; i <= m; i++) scanf("%d", &w[i]);
  for (i = 1; i <= m; i++) scanf("%d", &c[i]);
  for (i = 1; i <= m; i++) scanf("%d%d", &a[i], &b[i]);
  scanf("%d", &s);
  srand((unsigned int)time(NULL));
  for (i = 1; i <= m; i++) ind[i] = i;
  sort(1, m);
  for (i = 1; i <= n; i++) fat[i] = i;
  memset(use, 0, sizeof(use));
  long long sum = 0;
  memset(first, 0, sizeof(first));
  for (sz = 0, i = 1; i <= m; i++)
    if (find(a[ind[i]]) != find(b[ind[i]])) {
      sum += w[ind[i]];
      addedge(a[ind[i]], b[ind[i]], ind[i]);
      addedge(b[ind[i]], a[ind[i]], ind[i]);
      use[ind[i]] = 1;
      fat[find(a[ind[i]])] = find(b[ind[i]]);
    }
  int d;
  for (d0 = 0, d = 1; d <= n; d0++, d *= 2)
    ;
  d0--;
  int rt = rand() % n + 1;
  bfs(rt);
  long long t, ans = sum + 1, e, e0;
  for (i = 1; i <= m; i++) {
    t = query(a[i], b[i]);
    if (sum - w[t] + w[i] - s / c[i] < ans) {
      ans = sum - w[t] + w[i] - s / c[i];
      e0 = t;
      e = i;
    }
  }
  printf("%I64d\n", ans);
  for (i = 1; i <= m; i++)
    if (i == e)
      printf("%d %d\n", i, w[i] - s / c[i]);
    else if (use[i] && i != e0)
      printf("%d %d\n", i, w[i]);
  return 0;
}
void addedge(int u, int v, int k) {
  sz++;
  next[sz] = first[u];
  first[u] = sz;
  tail[sz] = v;
  num[sz] = k;
}
void sort(int l, int r) {
  if (l >= r) return;
  int i = l, j = r - 1, x = rand() % (r - l + 1) + l;
  swap(x, r);
  while (i <= j) {
    while (i <= j && w[ind[i]] < w[ind[r]]) i++;
    if (i <= j) swap(i, j--);
    while (i <= j && w[ind[j]] > w[ind[r]]) j--;
    if (i <= j) swap(i++, j);
  }
  swap(i, r);
  sort(l, i - 1);
  sort(i + 1, r);
}
void swap(int i, int j) {
  int t = ind[i];
  ind[i] = ind[j];
  ind[j] = t;
}
void bfs(int u0) {
  memset(par, 0, sizeof(par));
  w[0] = 0;
  memset(max, 0, sizeof(max));
  dep[u0] = 1;
  int f = 1, r = 1, u, v, e, i;
  q[1] = u0;
  while (f <= r) {
    u = q[f++];
    for (i = 1; i <= d0; i++) {
      par[u][i] = par[par[u][i - 1]][i - 1];
      max[u][i] = w[max[par[u][i - 1]][i - 1]] > w[max[u][i - 1]]
                      ? max[par[u][i - 1]][i - 1]
                      : max[u][i - 1];
    }
    for (e = first[u]; e; e = next[e]) {
      v = tail[e];
      if (v == par[u][0]) continue;
      dep[v] = dep[u] + 1;
      par[v][0] = u;
      max[v][0] = num[e];
      q[++r] = v;
    }
  }
}
int find(int k) {
  if (fat[k] == k) return k;
  int i, l = 0;
  for (i = k; fat[i] != i; i = fat[i]) stk[++l] = i;
  while (l) fat[stk[l--]] = i;
  return i;
}
int query(int u, int v) {
  int t;
  if (dep[u] < dep[v]) {
    t = u;
    u = v;
    v = t;
  }
  int d, ans = 0, i;
  for (i = d0, d = 1 << d0; i >= 0; i--, d /= 2)
    if (dep[u] - dep[v] >= d) {
      if (w[max[u][i]] > w[ans]) ans = max[u][i];
      u = par[u][i];
    }
  if (u == v) return ans;
  for (i = d0; i >= 0; i--)
    if (par[u][i] != par[v][i]) {
      if (w[max[u][i]] > w[ans]) ans = max[u][i];
      if (w[max[v][i]] > w[ans]) ans = max[v][i];
      u = par[u][i];
      v = par[v][i];
    }
  if (w[max[u][0]] > w[ans]) ans = max[u][0];
  if (w[max[v][0]] > w[ans]) ans = max[v][0];
  return ans;
}
