#include <bits/stdc++.h>
using namespace std;
const long long N = 2e5 + 100, CNT = 20, INF = 1e16 + 7;
struct edge {
  long long a, b;
  long long w, s;
  long long num;
};
long long p[N], deep[N], sp[21][N], spval[21][N], used[N];
long long n, m, cnt;
vector<pair<long long, long long> > d[N];
edge t[N];
long long get(long long a) {
  if (p[a] == a) return a;
  return p[a] = get(p[a]);
}
void merge(long long a, long long b) {
  a = get(a);
  b = get(b);
  if (rand() % 2)
    p[a] = b;
  else
    p[b] = a;
}
void dfs(long long v, long long p, long long z) {
  deep[v] = z;
  for (auto x : d[v]) {
    if (x.first == p) continue;
    sp[0][x.first] = v;
    spval[0][x.first] = x.second;
    dfs(x.first, v, z + 1);
  }
}
void build() {
  for (long long i = 1; i <= 20; i++) {
    for (long long j = 1; j <= n; j++) {
      sp[i][j] = sp[i - 1][sp[i - 1][j]];
      spval[i][j] = max(spval[i - 1][j], spval[i - 1][sp[i - 1][j]]);
    }
  }
}
long long get(long long a, long long b) {
  if (deep[a] < deep[b]) swap(a, b);
  long long maxl = 0;
  for (long long i = 20; i >= 0; i--) {
    if (deep[sp[i][a]] >= deep[b]) {
      maxl = max(maxl, spval[i][a]);
      a = sp[i][a];
    }
  }
  for (long long i = 20; i >= 0; i--) {
    if (sp[i][a] != sp[i][b]) {
      maxl = max(maxl, spval[i][a]);
      maxl = max(maxl, spval[i][b]);
      a = sp[i][a];
      b = sp[i][b];
    }
  }
  if (a != b)
    return max({maxl, spval[0][a], spval[0][b]});
  else
    return maxl;
}
long long getc(long long a, long long b) {
  if (deep[a] < deep[b]) swap(a, b);
  for (long long i = 20; i >= 0; i--) {
    if (deep[sp[i][a]] >= deep[b]) {
      a = sp[i][a];
    }
  }
  for (long long i = 20; i >= 0; i--) {
    if (sp[i][a] != sp[i][b]) {
      a = sp[i][a];
      b = sp[i][b];
    }
  }
  if (a == b)
    return a;
  else
    return sp[0][a];
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> m;
  for (long long i = 1; i <= m; i++) {
    cin >> t[i].w;
    t[i].num = i;
  }
  for (long long i = 1; i <= m; i++) {
    cin >> t[i].s;
  }
  for (long long i = 1; i <= m; i++) {
    long long a, b;
    cin >> t[i].a >> t[i].b;
  }
  cin >> cnt;
  sort(t + 1, t + 1 + m, [](edge a, edge b) { return a.w < b.w; });
  for (long long i = 1; i <= n; i++) {
    p[i] = i;
  }
  long long allsum = 0;
  for (long long i = 1; i <= m; i++) {
    if (get(t[i].a) == get(t[i].b)) continue;
    merge(t[i].a, t[i].b);
    allsum += t[i].w;
    d[t[i].a].push_back(make_pair(t[i].b, t[i].w));
    d[t[i].b].push_back(make_pair(t[i].a, t[i].w));
    used[i] = 1;
  }
  sp[0][1] = 1;
  dfs(1, 1, 1);
  build();
  long long minl = INF, ans = 0;
  for (long long i = 1; i <= m; i++) {
    long long tmp = allsum;
    if (!used[i]) {
      tmp -= get(t[i].a, t[i].b);
      tmp += t[i].w;
    }
    tmp -= cnt / t[i].s;
    if (minl > tmp) {
      ans = i;
      minl = tmp;
    }
  }
  cout << minl << endl;
  long long kek = get(t[ans].a, t[ans].b);
  long long c = getc(t[ans].a, t[ans].b);
  long long k = t[ans].a;
  long long tmp1, tmp2;
  while (k != c) {
    if (kek == spval[0][k]) {
      tmp1 = k;
      tmp2 = sp[0][k];
      break;
    }
    k = sp[0][k];
  }
  k = t[ans].b;
  while (k != c) {
    if (kek == spval[0][k]) {
      tmp1 = k;
      tmp2 = sp[0][k];
      break;
    }
    k = sp[0][k];
  }
  if (tmp1 > tmp2) swap(tmp1, tmp2);
  for (long long i = 1; i <= m; i++) {
    if (used[i] == 1 && tmp1 == min(t[i].a, t[i].b) &&
        tmp2 == max(t[i].a, t[i].b)) {
      used[i] = 0;
      break;
    }
  }
  used[ans] = 1;
  for (long long i = 1; i <= m; i++) {
    if (ans == i) {
      cout << t[i].num << ' ';
      cout << t[i].w - (cnt / t[i].s) << endl;
      continue;
    }
    if (used[i]) {
      cout << t[i].num << ' ' << t[i].w << endl;
    }
  }
}
