#include <bits/stdc++.h>
using namespace std;
const int MAXN = int(2e5 + 5);
int n, m, S;
int POW[25];
int f[MAXN];
bool vis[MAXN];
bool flag[MAXN];
long long tmp, tot, Ans, t;
struct edge {
  int u, v, id;
  int w, c;
} e[MAXN];
struct node {
  int to, id;
  node() {}
  node(int T, int I) : to(T), id(I) {}
};
vector<node> G[MAXN];
void Addedge(int u, int v, int id) {
  G[u].push_back(node(v, id));
  G[v].push_back(node(u, id));
}
void Init() {
  POW[0] = 1;
  for (int i = 1; i <= 25; i++) POW[i] = 2 * POW[i - 1];
}
int Find(int x) { return x == f[x] ? x : f[x] = Find(f[x]); }
bool cmp(edge a, edge b) { return a.w < b.w; }
bool cmp2(edge a, edge b) { return a.id < b.id; }
void Kruskal() {
  sort(e + 1, e + m + 1, cmp);
  for (int i = 1; i <= n; i++) f[i] = i;
  t = 0;
  e[0].c = int(1e9 + 5);
  for (int i = 1; i <= m; i++) {
    int u = e[i].u, v = e[i].v;
    int fx = Find(u), fy = Find(v);
    if (fx != fy) {
      Addedge(u, v, i);
      f[fx] = fy;
      vis[i] = 1;
      tmp += e[i].w;
      if (e[i].c < e[t].c) t = i;
    }
  }
  tot = tmp;
  tmp -= S / e[t].c;
}
int MaxId(int a, int b) { return (e[a].w < e[b].w) ? b : a; }
int Max[MAXN][25 + 5];
int fa[MAXN][25 + 5];
int dep[MAXN];
void Dfs(int u) {
  for (int i = 1; i <= 25; i++) {
    fa[u][i] = fa[fa[u][i - 1]][i - 1];
    Max[u][i] = MaxId(Max[u][i - 1], Max[fa[u][i - 1]][i - 1]);
  }
  for (int i = 0; i < G[u].size(); i++) {
    int v = G[u][i].to;
    if (v == fa[u][0]) continue;
    dep[v] = dep[u] + 1;
    Max[v][0] = G[u][i].id;
    fa[v][0] = u;
    Dfs(v);
  }
}
int LCA(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  int t = dep[u] - dep[v];
  for (int i = 0; POW[i] <= t; i++)
    if (POW[i] & t) u = fa[u][i];
  if (u == v) return u;
  for (int i = 25; i >= 0; i--)
    if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
  return fa[u][0];
}
int Query(int u, int v) {
  int t = dep[u] - dep[v];
  int ret = 0;
  for (int i = 0; POW[i] <= t; i++)
    if (POW[i] & t) {
      ret = MaxId(ret, Max[u][i]);
      u = fa[u][i];
    }
  return ret;
}
int main() {
  Init();
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    e[i].id = i;
    scanf("%d", &e[i].w);
  }
  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);
  Kruskal();
  e[0].w = -int(1e9 + 5);
  fill(Max[1], Max[1] + 25 + 1, 0);
  Dfs(1);
  long long Ans = tmp;
  int Last = -1, now = -1;
  for (int i = 1; i <= m; i++)
    if (e[i].c < e[t].c) {
      int u = e[i].u, v = e[i].v;
      int q = LCA(u, v);
      int x = MaxId(Query(u, q), Query(v, q));
      tmp = (long long)tot - e[x].w + e[i].w - S / e[i].c;
      if (Ans > tmp) {
        Ans = tmp;
        vis[(Last != -1) ? Last : 0] = 1;
        vis[x] = 0;
        Last = x;
        vis[(now != -1) ? now : 0] = 0;
        vis[i] = 1;
        now = i;
      }
    }
  printf("%I64d\n", Ans);
  if (now == -1) now = t;
  for (int i = 1; i <= m; i++)
    if (vis[i]) {
      if (now == i) e[i].w -= S / e[i].c;
      flag[e[i].id] = 1;
    }
  sort(e + 1, e + m + 1, cmp2);
  for (int i = 1; i <= m; i++)
    if (flag[i]) printf("%d %d\n", i, e[i].w);
}
