#include <bits/stdc++.h>
using namespace std;
const int nm = 200010;
const long long inf = 1000000000000000ll;
struct edge {
  int u, v, cs;
  long long w, c;
};
int n, m;
edge a[nm];
bool chosen[nm];
int cha[nm], ncon[nm];
vector<pair<int, long long> > adj[nm];
long long wmax[nm][20];
int d[nm];
int dad[nm][20];
long long money;
bool cmp(edge a, edge b) { return a.w < b.w; }
int root(int u) {
  while (cha[u]) u = cha[u];
  return u;
}
void noi(int u, int v) {
  if (ncon[u] < ncon[v]) {
    cha[u] = v;
    ncon[v] += ncon[u];
  } else {
    cha[v] = u;
    ncon[u] += ncon[v];
  }
}
void dfs(int i) {
  for (int j = 1; d[i] - (1 << j) >= 1; ++j) {
    dad[i][j] = dad[dad[i][j - 1]][j - 1];
    wmax[i][j] = max(wmax[i][j - 1], wmax[dad[i][j - 1]][j - 1]);
  }
  for (int k = 0; k < adj[i].size(); ++k) {
    int j = adj[i][k].first;
    long long w = adj[i][k].second;
    if (j != dad[i][0]) {
      dad[j][0] = i;
      wmax[j][0] = w;
      d[j] = d[i] + 1;
      dfs(j);
    }
  }
}
int jump(int u, int n) {
  for (int i = 0; n; ++i) {
    if ((n >> i) & 1) {
      u = dad[u][i];
      n = (~(1 << i)) & n;
    }
  }
  return u;
}
int lca(int u, int v) {
  if (d[u] > d[v])
    u = jump(u, d[u] - d[v]);
  else if (d[v] > d[u])
    v = jump(v, d[v] - d[u]);
  if (u == v) return u;
  int i = log(d[u]) / log(2);
  while (dad[u][0] != dad[v][0]) {
    for (;; --i)
      if (dad[u][i] != dad[v][i]) break;
    u = dad[u][i];
    v = dad[v][i];
  }
  return dad[u][0];
}
long long getmaxup(int n, int u) {
  long long res = -1;
  for (int i = 0; n; ++i) {
    if ((n >> i) & 1) {
      res = max(res, wmax[u][i]);
      u = dad[u][i];
      n = (~(1 << i)) & n;
    }
  }
  return res;
}
long long getmax(int u, int v) {
  int x = lca(u, v);
  return max(getmaxup(d[u] - d[x], u), getmaxup(d[v] - d[x], v));
}
int getMaxEdge(int u, int v) {
  int x = lca(u, v);
  int i = u;
  long long emax = -1;
  int umax, vmax;
  while (i != x) {
    if (wmax[i][0] > emax) {
      emax = wmax[i][0];
      umax = i;
      vmax = dad[i][0];
    }
    i = dad[i][0];
  }
  i = v;
  while (i != x) {
    if (wmax[i][0] > emax) {
      emax = wmax[i][0];
      umax = i;
      vmax = dad[i][0];
    }
    i = dad[i][0];
  }
  for (i = 1; i <= m; ++i) {
    if (chosen[i] && ((a[i].u == umax && a[i].v == vmax) ||
                      (a[i].u == vmax && a[i].v == umax))) {
      return i;
    }
  }
  return 0;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; ++i) scanf("%I64d", &a[i].w);
  for (int i = 1; i <= m; ++i) {
    scanf("%I64d", &a[i].c);
    a[i].cs = i;
  }
  for (int i = 1; i <= m; ++i) scanf("%d%d", &a[i].u, &a[i].v);
  scanf("%I64d", &money);
  sort(a + 1, a + m + 1, cmp);
  long long cmin = inf;
  for (int i = 1; i <= n; ++i) ncon[i] = 1;
  long long s = 0;
  for (int i = 1; i <= m; ++i) {
    int u = root(a[i].u), v = root(a[i].v);
    if (u != v) {
      noi(u, v);
      chosen[i] = 1;
      cmin = min(cmin, a[i].c);
      s += a[i].w;
      adj[a[i].u].push_back(make_pair(a[i].v, a[i].w));
      adj[a[i].v].push_back(make_pair(a[i].u, a[i].w));
    }
  }
  d[1] = 1;
  dfs(1);
  long long res = s - money / cmin;
  int replace = -1;
  for (int i = 1; i <= m; ++i) {
    if (!chosen[i] && a[i].c < cmin) {
      long long tmp = getmax(a[i].u, a[i].v);
      long long tmp2 = s - tmp + a[i].w - money / a[i].c;
      if (tmp2 < res) {
        res = tmp2;
        replace = i;
      }
    }
  }
  if (replace != -1) {
    int e = getMaxEdge(a[replace].u, a[replace].v);
    chosen[e] = 0;
    chosen[replace] = 1;
    cmin = a[replace].c;
  }
  printf("%I64d\n", res);
  for (int i = 1; i <= m; ++i) {
    if (chosen[i]) {
      printf("%d ", a[i].cs);
      if (a[i].c == cmin) {
        printf("%I64d\n", a[i].w - money / a[i].c);
        money = 0;
      } else
        printf("%I64d\n", a[i].w);
    }
  }
}
