#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
struct Edge {
  long long w, c;
  int u, v, id;
} a[MAXN];
struct info {
  int v, id;
};
vector<info> G[MAXN];
bool vis[MAXN], done[MAXN];
int p[MAXN], p2[MAXN][30], deep[MAXN], dp[MAXN][30];
int maxw(int i, int j) { return a[i].w < a[j].w ? j : i; }
bool cmp(Edge a, Edge b) {
  if (a.w == b.w) return a.id < b.id;
  return a.w < b.w;
}
int find(int x) { return x == p[x] ? x : p[x] = find(p[x]); }
int lca(int a, int b) {
  if (deep[a] < deep[b]) swap(a, b);
  int t = deep[a] - deep[b];
  for (int i = 0; (1 << i) <= t; i++)
    if ((1 << i) & t) a = p2[a][i];
  for (int i = 20; i >= 0; i--) {
    if (p2[a][i] != p2[b][i]) a = p2[a][i], b = p2[b][i];
  }
  return a == b ? a : p2[a][0];
}
void dfs(int u, int fa) {
  for (int i = 1; i <= 20; i++) {
    p2[u][i] = p2[p2[u][i - 1]][i - 1];
    dp[u][i] = maxw(dp[u][i - 1], dp[p2[u][i - 1]][i - 1]);
  }
  for (int i = 0; i < G[u].size(); i++) {
    int v = G[u][i].v, id = G[u][i].id;
    if (v == fa) continue;
    p2[v][0] = u;
    dp[v][0] = id;
    deep[v] = deep[u] + 1;
    dfs(v, u);
  }
}
int query(int a, int b) {
  int t = deep[a] - deep[b];
  int ret = 0;
  for (int i = 0; (1 << i) <= t; i++)
    if ((1 << i) & t) {
      ret = maxw(ret, dp[a][i]);
      a = p2[a][i];
    }
  return ret;
}
int main() {
  memset(vis, 0, sizeof(vis));
  memset(done, 0, sizeof(done));
  memset(dp, 0, sizeof(dp));
  memset(p2, 0, sizeof(p2));
  int n, m;
  cin >> n >> m;
  for (int i = 0; i <= n; i++) p[i] = i;
  for (int i = 1; i <= m; i++) scanf("%I64d", &a[i].w), a[i].id = i;
  for (int i = 1; i <= m; i++) scanf("%I64d", &a[i].c);
  for (int i = 1; i <= m; i++) scanf("%d%d", &a[i].u, &a[i].v);
  long long s;
  cin >> s;
  sort(a + 1, a + m + 1, cmp);
  int id1 = -1, id2 = -1;
  long long sum = 0;
  for (int i = 1; i <= m; i++) {
    int u = a[i].u, v = a[i].v, x = find(u), y = find(v);
    if (x != y) {
      p[x] = y;
      G[u].push_back((info){v, i});
      G[v].push_back((info){u, i});
      sum += a[i].w;
      if (id1 == -1 || a[i].c < a[id1].c) id1 = i;
      done[i] = 1;
    }
  }
  long long ans = sum - s / a[id1].c;
  deep[1] = 0;
  dfs(1, 0);
  for (int i = 1; i <= m; i++)
    if (!done[i]) {
      int u = a[i].u, v = a[i].v, root = lca(u, v);
      int x = maxw(query(u, root), query(v, root));
      long long tmp = sum - a[x].w + a[i].w - s / a[i].c;
      if (ans > tmp) {
        ans = tmp;
        id1 = i;
        id2 = x;
      }
    }
  cout << ans << endl;
  if (id2 != -1) done[id2] = 0;
  done[id1] = 1;
  a[id1].w -= s / a[id1].c;
  for (int i = 1; i <= m; i++)
    if (done[i]) printf("%d %I64d\n", a[i].id, a[i].w);
  return 0;
}
