#include <bits/stdc++.h>
using namespace std;
const long long N = 3e5 + 100;
const long long big = 1e18;
const long long block = 800;
const long long mod = 1e6;
bool fans = 0;
long long n, m;
long long w[N];
long long c[N];
vector<pair<long long, long long> > g[N], supans;
vector<pair<pair<long long, long long>, pair<long long, long long> > > gr;
vector<long long> ba, go;
long long p[N];
long long full;
vector<pair<long long, long long> > grph;
long long fnd(long long a) { return p[a] = (p[a] == a ? a : fnd(p[a])); }
void unt(long long a, long long b, long long i) {
  long long v = a, u = b;
  a = fnd(a), b = fnd(b);
  if (a == b) {
    if (!fans) ba.push_back(i);
    return;
  }
  if (fans) supans.push_back({i, w[i]});
  if (!fans) {
    go.push_back(i);
    g[v].push_back({u, i}), g[u].push_back({v, i});
  }
  p[b] = a;
  full += w[i];
}
long long tin[N], tout[N], tmr;
long long kth[N][21];
pair<long long, long long> mx[N][21];
void dfs(long long v = 1, long long pr = 0, long long reb = 0) {
  kth[v][0] = pr;
  tin[v] = ++tmr;
  mx[v][0] = {w[reb], reb};
  for (int i = 1; i <= 20; i++)
    kth[v][i] = kth[kth[v][i - 1]][i - 1],
    mx[v][i] = max(mx[v][i - 1], mx[kth[v][i - 1]][i - 1]);
  for (auto u : g[v])
    if (u.first != pr) dfs(u.first, v, u.second);
  tout[v] = tmr;
}
bool upper(long long a, long long b) {
  return (tin[a] <= tin[b] && tout[b] <= tout[a]);
}
long long LCA(long long a, long long b) {
  if (upper(a, b)) return a;
  if (upper(b, a)) return b;
  for (int i = 20; i >= 0; i--) {
    if (!upper(kth[a][i], b)) a = kth[a][i];
  }
  return kth[a][0];
}
pair<long long, long long> qu(long long a, long long b) {
  long long lca = LCA(a, b);
  pair<long long, long long> sub = {0, 0};
  long long t = 2;
  while (t--) {
    if (lca != a) {
      for (int i = 20; i >= 0; i--) {
        if (!upper(kth[a][i], lca)) sub = max(mx[a][i], sub), a = kth[a][i];
      }
      sub = max(sub, mx[a][0]);
    }
    swap(a, b);
  }
  return sub;
}
int main() {
  tout[0] = big;
  cin >> n >> m;
  for (int i = 1; i <= m; i++) cin >> w[i];
  for (int i = 1; i <= m; i++) cin >> c[i];
  for (int i = 1, a, b; i <= m; i++) {
    cin >> a >> b;
    grph.push_back({a, b});
    gr.push_back({{w[i], i}, {a, b}});
  }
  for (int i = 1; i <= n; i++) p[i] = i;
  long long S;
  cin >> S;
  sort((gr).begin(), (gr).end());
  for (auto u : gr) unt(u.second.first, u.second.second, u.first.second);
  dfs();
  pair<long long, long long> ans = {big, 0};
  for (auto u : go) {
    pair<long long, long long> zzzz = {full - S / c[u], u};
    ans = min(ans, zzzz);
  }
  for (auto u : ba) {
    pair<long long, long long> h = grph[u - 1];
    long long z = w[u] - (S / c[u]);
    h = qu(h.first, h.second);
    if (h.first > z)
      ans = min(ans, pair<long long, long long>({full - h.first + z, u}));
  }
  w[ans.second] -= S / c[ans.second];
  for (int i = 0; i < gr.size(); i++) {
    if (gr[i].first.second == ans.second) gr[i].first.first = w[ans.second];
  }
  for (int i = 1; i <= n; i++) p[i] = i;
  sort((gr).begin(), (gr).end());
  fans = 1;
  for (auto u : gr) {
    unt(u.second.first, u.second.second, u.first.second);
  }
  cout << ans.first << '\n';
  for (auto u : supans) cout << u.first << " " << u.second << '\n';
}
