#include <bits/stdc++.h>
using namespace std;
const long long N = 4e5 + 5;
const long long M = 1e6 + 5;
const long long inf = 1e18;
const long long eps = 1e-5;
inline long long read() {
  long long s = 0;
  register bool neg = 0;
  register char c = getchar();
  for (; c < '0' || c > '9'; c = getchar()) neg |= (c == '-');
  for (; c >= '0' && c <= '9'; s = s * 10 + (c ^ 48), c = getchar())
    ;
  s = (neg ? -s : s);
  return s;
}
long long a, b, c, fa[N][21], mx[N][21], F[N], dep[N], C[N];
bool vis[N];
struct node {
  long long x, y, val, real, id;
  bool vis;
  bool operator<(const node &o) const { return val < o.val; }
} s[N];
vector<pair<long long, long long> > st[N];
inline long long f(long long n) { return F[n] == n ? n : F[n] = f(F[n]); }
inline void dfs(long long n, long long lst, long long p) {
  dep[n] = dep[lst] + 1;
  fa[n][0] = lst;
  mx[n][0] = p;
  for (long long i = (1); i <= (20); ++i) {
    fa[n][i] = fa[fa[n][i - 1]][i - 1];
    mx[n][i] = max(mx[n][i - 1], mx[fa[n][i - 1]][i - 1]);
  }
  for (long long i = (0); i <= (((long long)((st[n]).size())) - 1); ++i) {
    long long v = st[n][i].first;
    if (v == lst) continue;
    dfs(v, n, st[n][i].second);
  }
}
inline long long LCA(long long n, long long m) {
  if (dep[n] < dep[m]) swap(n, m);
  long long res = -inf;
  for (long long i = (20); i >= (0); --i)
    if (dep[fa[n][i]] >= dep[m]) {
      res = max(res, mx[n][i]);
      n = fa[n][i];
    }
  if (n == m) return res;
  for (long long i = (20); i >= (0); --i)
    if (fa[n][i] != fa[m][i]) {
      res = max(res, max(mx[n][i], mx[m][i]));
      n = fa[n][i];
      m = fa[m][i];
    }
  res = max(res, max(mx[n][0], mx[m][0]));
  return res;
}
inline void del(long long n, long long m) {
  vis[n] = vis[m] = 1;
  while (n != m) {
    if (dep[n] <= dep[m])
      m = fa[m][0];
    else
      n = fa[n][0];
    vis[n] = vis[m] = 1;
  }
}
signed main() {
  memset(mx, -0x3f, sizeof(mx));
  a = read();
  b = read();
  for (long long i = (1); i <= (a); ++i) F[i] = i;
  for (long long i = (1); i <= (b); ++i) s[i].val = read();
  for (long long i = (1); i <= (b); ++i) C[i] = read();
  for (long long i = (1); i <= (b); ++i) {
    s[i].x = read();
    s[i].y = read();
    s[i].id = i;
  }
  c = read();
  for (long long i = (1); i <= (b); ++i) s[i].real = s[i].val - c / C[i];
  sort(s + 1, s + b + 1);
  long long mn = 1, ans = 0, a1, a2 = inf, t1, t2, t3, mn1;
  for (long long i = (1); i <= (b); ++i) {
    long long f1 = f(s[i].x), f2 = f(s[i].y);
    if (f1 == f2) continue;
    F[f1] = f2;
    ans += s[i].val;
    if (s[i].real - s[i].val < s[mn].real - s[mn].val) mn = i;
    s[i].vis = 1;
    st[s[i].x].push_back(make_pair(s[i].y, s[i].val));
    st[s[i].y].push_back(make_pair(s[i].x, s[i].val));
  }
  a1 = ans + s[mn].real - s[mn].val;
  dfs(1, 0, -inf);
  for (long long i = (1); i <= (b); ++i) {
    if (s[i].vis) continue;
    long long tmp = LCA(s[i].x, s[i].y);
    if (ans - tmp + s[i].real < a2) {
      a2 = ans - tmp + s[i].real;
      t3 = tmp;
      t1 = s[i].x, t2 = s[i].y;
      mn1 = i;
    }
  }
  printf("%lld\n", min(a1, a2));
  if (a1 < a2) {
    for (long long i = (1); i <= (b); ++i)
      if (s[i].vis) {
        if (mn == i)
          printf("%lld %lld\n", s[i].id, s[i].real);
        else
          printf("%lld %lld\n", s[i].id, s[i].val);
      }
  } else {
    del(t1, t2);
    for (long long i = (1); i <= (b); ++i) {
      if (!s[i].vis) continue;
      if (t1 && vis[s[i].x] && vis[s[i].y] && s[i].val == t3)
        t1 = 0;
      else
        printf("%lld %lld\n", s[i].id, s[i].val);
    }
    printf("%lld %lld\n", s[mn1].id, s[mn1].real);
  }
  return 0;
}
