#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
const int M = 2e5 + 5;
int f[N];
int fa(int x) { return x == f[x] ? f[x] : f[x] = fa(f[x]); }
bool Merge(int u, int v) {
  u = fa(u);
  v = fa(v);
  if (u == v) return false;
  f[u] = v;
  return true;
}
struct Node {
  int u, v, w, c, idx;
  bool operator<(const Node &rhs) const { return w < rhs.w; }
} E[M];
struct node {
  int e, next, w;
} edge[N << 1];
int tot;
int first[N];
void init(int n) {
  tot = 0;
  for (int i = 0; i <= n; i++) first[i] = -1, f[i] = i;
}
void add(int u, int v, int w) {
  edge[tot] = (node){v, first[u], w};
  first[u] = tot++;
}
const int LOG = 18;
int par[N][LOG], dep[N], UP[N], mx[N][LOG];
void dfs(int u, int fa, int depth) {
  dep[u] = depth;
  if (u == 1) {
    for (int i = 0; i < LOG; i++) par[u][i] = 1, mx[u][i] = 0;
  } else {
    par[u][0] = fa;
    mx[u][0] = UP[u];
    for (int i = 1; i < LOG; i++)
      par[u][i] = par[par[u][i - 1]][i - 1],
      mx[u][i] = max(mx[u][i - 1], mx[par[u][i - 1]][i - 1]);
  }
  for (int i = first[u]; i != -1; i = edge[i].next) {
    int v = edge[i].e;
    if (v == fa) continue;
    UP[v] = edge[i].w;
    dfs(v, u, depth + 1);
  }
}
int up(int &x, int step) {
  int mxv = 0;
  for (int i = 0; i < LOG; i++)
    if (step & (1 << i)) mxv = max(mxv, mx[x][i]), x = par[x][i];
  return mxv;
}
int get_mx(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  int mxv = up(u, dep[u] - dep[v]);
  if (u == v) return mxv;
  for (int i = LOG - 1; i >= 0; i--) {
    if (par[u][i] != par[v][i]) {
      mxv = max(mxv, mx[u][i]);
      mxv = max(mxv, mx[v][i]);
      u = par[u][i];
      v = par[v][i];
    }
  }
  return max(mxv, max(mx[u][0], mx[v][0]));
}
int n, m, S;
int used[M];
int main() {
  scanf("%d%d", &n, &m);
  init(n);
  for (int i = 1; i <= m; i++) scanf("%d", &E[i].w), E[i].idx = i;
  for (int i = 1; i <= m; i++) scanf("%d", &E[i].c);
  for (int i = 1; i <= m; i++) scanf("%d%d", &E[i].u, &E[i].v);
  scanf("%d", &S);
  sort(E + 1, E + 1 + m);
  long long sum = 0;
  for (int i = 1; i <= m; i++)
    if (Merge(E[i].u, E[i].v)) {
      sum += E[i].w;
      used[i] = 1;
      add(E[i].u, E[i].v, E[i].w);
      add(E[i].v, E[i].u, E[i].w);
    }
  dfs(1, -1, 1);
  int best = -1;
  long long bsum = sum;
  for (int i = 1; i <= m; i++) {
    if (used[i]) {
      long long nsum = sum - S / E[i].c;
      if (bsum > nsum) {
        best = i;
        bsum = nsum;
      }
    } else {
      long long nsum = sum - get_mx(E[i].u, E[i].v) + E[i].w - S / E[i].c;
      if (bsum > nsum) {
        best = i;
        bsum = nsum;
      }
    }
  }
  for (int i = 1; i <= n; i++) f[i] = i;
  for (int i = 1; i <= m; i++) used[i] = 0;
  Merge(E[best].u, E[best].v);
  used[best] = 1;
  for (int i = 1; i <= m; i++)
    if (Merge(E[i].u, E[i].v)) used[i] = 1;
  printf("%I64d\n", bsum);
  for (int i = 1; i <= m; i++)
    if (used[i]) {
      if (i == best)
        printf("%d %d\n", E[i].idx, E[i].w - S / E[i].c);
      else
        printf("%d %d\n", E[i].idx, E[i].w);
    }
  return 0;
}
