#include <bits/stdc++.h>
using namespace std;
int n, m;
const int mxn = (2e5) + 5;
int w[mxn];
int c[mxn];
int S;
int pd[mxn];
int sz[mxn];
int find(int x) {
  if (x == pd[x]) return x;
  return pd[x] = find(pd[x]);
}
void merge(int x, int y) {
  x = find(x);
  y = find(y);
  if (sz[x] > sz[y]) swap(x, y);
  pd[x] = y;
  sz[y] += sz[x];
}
long long mst;
bool inmst[mxn];
vector<pair<pair<int, int>, pair<int, int> > > e;
vector<pair<int, pair<int, int> > > tr[mxn];
int dep[mxn];
pair<int, int> mn[mxn][22];
int pr[mxn][22];
void dfs(int v, int p) {
  for (int i = 0; i < tr[v].size(); ++i) {
    int u = tr[v][i].first;
    int w = tr[v][i].second.first;
    int in = tr[v][i].second.second;
    if (u == p) continue;
    dep[u] = dep[v] + 1;
    pr[u][0] = v;
    mn[u][0] = {w, in};
    dfs(u, v);
  }
}
int mxlog;
void proc() {
  while ((1 << mxlog) <= n) ++mxlog;
  for (int j = 1; j < mxlog; ++j)
    for (int i = 1; i <= n; ++i) {
      mn[i][j] = mn[i][j - 1];
      if (mn[pr[i][j - 1]][j - 1].first > mn[i][j].first)
        mn[i][j] = mn[pr[i][j - 1]][j - 1];
      pr[i][j] = pr[pr[i][j - 1]][j - 1];
    }
}
int lca(int x, int y) {
  if (dep[x] > dep[y]) swap(x, y);
  int dif = dep[y] - dep[x];
  for (int i = 0; i < mxlog; ++i)
    if (dif & (1 << i)) y = pr[y][i];
  if (x == y) return x;
  for (int i = mxlog - 1; i >= 0; --i)
    if (pr[x][i] != pr[y][i]) {
      x = pr[x][i];
      y = pr[y][i];
    }
  return pr[x][0];
}
pair<int, int> up(int x, int nd) {
  pair<int, int> ans;
  ans.first = 0;
  ans.second = -1;
  int dif = dep[x] - dep[nd];
  for (int i = 0; i < mxlog; ++i)
    if (dif & (1 << i)) {
      if (mn[x][i].first > ans.first) ans = mn[x][i];
      x = pr[x][i];
    }
  return ans;
}
pair<int, int> query(int x, int y) {
  int nd = lca(x, y);
  pair<int, int> a = up(x, nd);
  pair<int, int> b = up(y, nd);
  if (a.first > b.first)
    return a;
  else
    return b;
}
int main() {
  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 <= n; ++i) pd[i] = i, sz[i] = 1;
  for (int i = 1; i <= m; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    e.push_back({{w[i], i}, {x, y}});
  }
  scanf("%d", &S);
  sort(e.begin(), e.end());
  for (int i = 0; i < m; ++i) {
    int w = e[i].first.first;
    int in = e[i].first.second;
    int x = e[i].second.first;
    int y = e[i].second.second;
    if (find(x) == find(y)) continue;
    merge(x, y);
    inmst[in] = true;
    mst = mst + w;
    tr[x].push_back({y, {w, in}});
    tr[y].push_back({x, {w, in}});
  }
  dfs(1, 1);
  proc();
  long long mn = mst;
  int in1 = -1;
  int in2 = -1;
  for (int i = 0; i < m; ++i) {
    int w = e[i].first.first;
    int in = e[i].first.second;
    int x = e[i].second.first;
    int y = e[i].second.second;
    if (inmst[in]) {
      int nm = S / c[in];
      long long nwmst = mst - nm;
      if (nwmst < mn) {
        mn = nwmst;
        in1 = in;
        in2 = -1;
      }
    } else {
      int nm = S / c[in];
      pair<int, int> a = query(x, y);
      long long nwmst = mst - a.first + w - nm;
      if (nwmst < mn) {
        mn = nwmst;
        in1 = in;
        in2 = a.second;
      }
    }
  }
  cout << mn << endl;
  for (int i = 1; i <= m; ++i) {
    if (i == in2) continue;
    if (inmst[i]) {
      if (in1 == i)
        printf("%d %d\n", i, w[i] - (S / c[i]));
      else
        printf("%d %d\n", i, w[i]);
    }
  }
  if (in2 != -1) printf("%d %d\n", in1, w[in1] - (S / c[in1]));
  return 0;
}
