#include <bits/stdc++.h>
using namespace std;
const int MX = 200500;
int a[MX];
int b[MX];
int c[MX];
int w[MX];
pair<int, int> q[MX];
bool intree[MX];
int pred[MX];
int oryshych_konb[MX];
int get_pred(int x) {
  while (x != pred[x]) x = pred[x];
  return x;
}
bool join(int x, int y) {
  x = get_pred(x);
  y = get_pred(y);
  if (x == y) return false;
  if (oryshych_konb[x] < oryshych_konb[y]) swap(x, y);
  if (oryshych_konb[x] == oryshych_konb[y]) oryshych_konb[x]++;
  pred[y] = x;
  return true;
}
const int SZ = 20;
int pr[MX][SZ];
pair<int, int> mx[MX][SZ];
int depth[MX];
vector<pair<int, int> > e[MX];
void dfs(int u) {
  for (int i = 1; i < SZ; i++) {
    int v = pr[u][i - 1];
    pr[u][i] = pr[v][i - 1];
    mx[u][i] = mx[u][i - 1];
    if (mx[v][i - 1].first > mx[u][i].first) mx[u][i] = mx[v][i - 1];
  }
  for (int i = 0; i < e[u].size(); i++) {
    int v = e[u][i].first;
    if (pr[u][0] == v) continue;
    int edge = e[u][i].second;
    pr[v][0] = u;
    mx[v][0] = {w[edge], edge};
    depth[v] = depth[u] + 1;
    dfs(v);
  }
}
int get_max(int u, int v) {
  if (depth[u] < depth[v]) swap(u, v);
  int d = depth[u] - depth[v];
  int z = mx[u][0].second;
  for (int i = 0; i < SZ; i++) {
    if (d & 1) {
      if (mx[u][i].first > w[z]) z = mx[u][i].second;
      u = pr[u][i];
    }
    d >>= 1;
  }
  if (u == v) return z;
  for (int i = SZ - 1; i >= 0; i--) {
    if (pr[u][i] != pr[v][i]) {
      if (mx[u][i].first > w[z]) z = mx[u][i].second;
      u = pr[u][i];
      if (mx[v][i].first > w[z]) z = mx[v][i].second;
      v = pr[v][i];
    }
  }
  if (u == v) return z;
  int i = 0;
  if (mx[u][i].first > w[z]) z = mx[u][i].second;
  u = pr[u][i];
  if (mx[v][i].first > w[z]) z = mx[v][i].second;
  v = pr[v][i];
  return z;
}
int main() {
  ios_base::sync_with_stdio(false);
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < n; i++) pred[i] = i;
  for (int i = 0; i < m; i++) {
    cin >> w[i];
  }
  for (int i = 0; i < m; i++) {
    cin >> c[i];
  }
  for (int i = 0; i < m; i++) {
    cin >> a[i] >> b[i];
    a[i]--;
    b[i]--;
    q[i] = {w[i], i};
  }
  sort(q, q + m);
  int s;
  cin >> s;
  for (int j = 0; j < m; j++) {
    int i = q[j].second;
    if (join(a[i], b[i])) {
      intree[i] = true;
      e[a[i]].push_back({b[i], i});
      e[b[i]].push_back({a[i], i});
    }
  }
  dfs(0);
  long long ans = 0;
  int r1 = 0;
  int r2 = 0;
  for (int i = 0; i < m; i++) {
    int edge = get_max(a[i], b[i]);
    long long ds = w[edge] - w[i] + s / c[i];
    if (ds <= ans) continue;
    r1 = i;
    r2 = edge;
    ans = ds;
  }
  w[r1] -= s / c[r1];
  intree[r2] = false;
  intree[r1] = true;
  long long sum = 0;
  for (int i = 0; i < m; i++) {
    if (intree[i]) {
      sum += w[i];
    }
  }
  cout << sum << "\n";
  for (int i = 0; i < m; i++) {
    if (intree[i]) {
      cout << i + 1 << ' ' << w[i] << "\n";
    }
  }
  return 0;
}
