#include <bits/stdc++.h>
const double Pi = acos(-1.0);
using namespace std;
const int maxN = 200005;
int n, m;
long long s;
struct edge {
  int u, v, ind;
  long long w, c;
  edge(int U, int V, int I, long long W, long long C)
      : u(U), v(V), ind(I), w(W), c(C){};
};
bool cmpW(const edge &a, const edge &b) { return a.w < b.w; }
bool cmpC(const edge &a, const edge &b) { return a.c < b.c; }
long long w[maxN], c[maxN];
vector<edge> E;
int mpar[maxN];
int findpar(int x) {
  if (mpar[x] != x) mpar[x] = findpar(mpar[x]);
  return mpar[x];
}
bool in[maxN];
vector<pair<int, int> > G[maxN];
int depth[maxN], par[maxN][19];
pair<int, int> pmx[maxN][19];
void dfs(int cur, int pre) {
  for (int i = 1; i < 19; i++) {
    par[cur][i] = par[par[cur][i - 1]][i - 1];
    pmx[cur][i] = max(pmx[cur][i - 1], pmx[par[cur][i - 1]][i - 1]);
  }
  for (int i = 0; i < (int)G[cur].size(); i++) {
    int nxt = G[cur][i].first, ei = G[cur][i].second;
    if (nxt != pre) {
      depth[nxt] = depth[cur] + 1;
      par[nxt][0] = cur;
      pmx[nxt][0] = pair<int, int>(w[ei], ei);
      dfs(nxt, cur);
    }
  }
}
void updMx(int xy, int i, int &mx, int &ei) {
  if (pmx[xy][i].first > mx) {
    mx = pmx[xy][i].first;
    ei = pmx[xy][i].second;
  }
}
int lcaMx(int x, int y) {
  if (depth[x] > depth[y]) swap(x, y);
  int mx = 0, ei = 0;
  for (int i = 18; i >= 0; i--) {
    if (depth[par[y][i]] >= depth[x]) {
      updMx(y, i, mx, ei);
      y = par[y][i];
    }
  }
  if (x == y) return ei;
  for (int i = 18; i >= 0; i--) {
    if (par[x][i] != par[y][i]) {
      updMx(x, i, mx, ei);
      updMx(y, i, mx, ei);
      x = par[x][i];
      y = par[y][i];
    }
  }
  updMx(x, 0, mx, ei);
  updMx(y, 0, mx, ei);
  return ei;
}
int main(int argc, char **argv) {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < m; i++) scanf("%lld", &w[i]);
  for (int i = 0; i < m; i++) scanf("%lld", &c[i]);
  int a, b;
  for (int i = 0; i < m; i++) {
    scanf("%d %d", &a, &b);
    a--;
    b--;
    E.push_back(edge(a, b, i, w[i], c[i]));
  }
  scanf("%lld", &s);
  sort(E.begin(), E.end(), cmpW);
  for (int i = 0; i < n; i++) mpar[i] = i;
  long long tot = 0;
  for (int i = 0; i < m; i++) {
    int pu = findpar(E[i].u), pv = findpar(E[i].v);
    if (pu != pv) {
      tot += E[i].w;
      mpar[pv] = pu;
      in[E[i].ind] = true;
      G[E[i].u].push_back(pair<int, int>(E[i].v, E[i].ind));
      G[E[i].v].push_back(pair<int, int>(E[i].u, E[i].ind));
    }
  }
  dfs(0, -1);
  int ei = -1, del = -1;
  long long nw = -1, ans = tot;
  for (int i = 0; i < m; i++) {
    int tmp = in[E[i].ind] ? E[i].ind : lcaMx(E[i].u, E[i].v),
        tw = E[i].w - (s / E[i].c);
    if (tot - w[tmp] + tw < ans) {
      ans = tot - w[tmp] + tw;
      ei = E[i].ind;
      nw = tw;
      del = tmp;
    }
  }
  printf("%lld\n", ans);
  for (int i = 0; i < m; i++) {
    if (in[i] && i != del) printf("%d %lld\n", i + 1, w[i]);
  }
  if (ei >= 0) printf("%d %lld\n", ei + 1, nw);
  return 0;
}
