#include <bits/stdc++.h>
using namespace std;
int w[200200];
int c[200200];
int from[200200];
int to[200200];
bool inostov[200200];
vector<int> v[200200];
vector<int> ostov;
vector<int> comp[200200];
int cid[200200];
void un(int a, int b) {
  if ((int)(comp[a]).size() < (int)(comp[b]).size()) {
    for (int i = 0; i < (int)(comp[a]).size(); i++) {
      comp[b].push_back(comp[a][i]);
      cid[comp[a][i]] = b;
    }
  } else {
    for (int i = 0; i < (int)(comp[b]).size(); i++) {
      comp[a].push_back(comp[b][i]);
      cid[comp[b][i]] = a;
    }
  }
}
void find_ostov(int n, int m) {
  for (int i = 1; i <= n; i++) cid[i] = i, comp[i].push_back(i);
  vector<pair<int, int> > edges;
  for (int i = 1; i <= m; i++) {
    edges.push_back(make_pair(w[i], i));
  }
  sort(edges.begin(), edges.end());
  for (int i = 0; i < (int)(edges).size(); i++) {
    int eid = edges[i].second;
    int a = from[eid];
    int b = to[eid];
    if (cid[a] == cid[b]) {
      continue;
    }
    un(cid[a], cid[b]);
    ostov.push_back(eid);
    inostov[eid] = true;
  }
}
int up[200200][20];
int calc[200200][20];
int dist[200200];
void go(int s, int lst = 0, int lstw = 0, int dep = 0) {
  up[s][0] = lst;
  calc[s][0] = lstw;
  dist[s] = dep;
  for (int i = 0; i < (int)(v[s]).size(); i++) {
    int nxt = from[v[s][i]];
    if (nxt == s) nxt = to[v[s][i]];
    if (nxt == lst) continue;
    go(nxt, s, v[s][i], dep + 1);
  }
}
int findmaxedge(int a, int b) {
  if (dist[a] < dist[b]) swap(a, b);
  int eid = -1;
  for (int deg = 19; deg >= 0; deg--) {
    if (dist[up[a][deg]] >= dist[b]) {
      if (eid == -1 || w[calc[a][deg]] > w[eid]) eid = calc[a][deg];
      a = up[a][deg];
    }
  }
  if (a == b) return eid;
  for (int deg = 19; deg >= 0; deg--) {
    if (up[a][deg] == up[b][deg]) continue;
    if (eid == -1 || w[calc[a][deg]] > w[eid]) eid = calc[a][deg];
    if (eid == -1 || w[calc[b][deg]] > w[eid]) eid = calc[b][deg];
    a = up[a][deg];
    b = up[b][deg];
  }
  if (eid == -1 || w[calc[a][0]] > w[eid]) eid = calc[a][0];
  if (eid == -1 || w[calc[b][0]] > w[eid]) eid = calc[b][0];
  return eid;
}
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; i++) scanf("%d", &w[i]);
  for (int i = 1; i <= m; i++) scanf("%d", &c[i]);
  for (int i = 1; i <= m; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    from[i] = a;
    to[i] = b;
    v[a].push_back(i);
    v[b].push_back(i);
  }
  int S;
  scanf("%d", &S);
  find_ostov(n, m);
  long long curW = 0;
  for (int i = 1; i <= m; i++) {
    if (inostov[i]) curW += w[i];
  }
  for (int i = 1; i <= n; i++) {
    v[i].clear();
  }
  for (int i = 1; i <= m; i++) {
    if (inostov[i]) {
      v[from[i]].push_back(i);
      v[to[i]].push_back(i);
    }
  }
  go(1);
  for (int deg = 1; deg < 20; deg++) {
    for (int i = 1; i <= n; i++) {
      up[i][deg] = up[up[i][deg - 1]][deg - 1];
      calc[i][deg] = calc[i][deg - 1];
      if (w[calc[up[i][deg - 1]][deg - 1]] > w[calc[i][deg]])
        calc[i][deg] = calc[up[i][deg - 1]][deg - 1];
    }
  }
  long long bestW = curW;
  int idx1 = -1, idx2 = -1;
  int chid = -1;
  int er = -1;
  for (int i = 1; i <= m; i++) {
    if (inostov[i]) {
      long long nxtW = curW - S / c[i];
      if (nxtW < bestW) {
        idx1 = -1;
        idx2 = -1;
        chid = i;
        er = -1;
        bestW = nxtW;
      }
    } else {
      int a = from[i];
      int b = to[i];
      int maxedge = findmaxedge(a, b);
      long long nxtW = curW - w[maxedge] + w[i] - S / c[i];
      if (nxtW < bestW) {
        idx1 = a;
        idx2 = b;
        chid = i;
        er = maxedge;
        bestW = nxtW;
      }
    }
  }
  printf("%lld\n", bestW);
  if (idx1 == -1 && idx2 == -1) {
    if (chid == -1) {
    } else {
      w[chid] -= S / c[chid];
    }
  } else {
    inostov[er] = false;
    inostov[chid] = true;
    w[chid] -= S / c[chid];
  }
  for (int i = 1; i <= m; i++) {
    if (inostov[i]) printf("%d %d\n", i, w[i]);
  }
  return 0;
}
