#include <bits/stdc++.h>
using namespace std;
const int maxn = 2 * 100000 + 1;
struct edge {
  int a, b;
  int w, c;
  int ind;
  edge() {}
  edge(int a, int b, int w, int c, int ind)
      : a(a), b(b), w(w), c(c), ind(ind) {}
};
bool cmp(const edge &e1, const edge &e2) { return e1.w < e2.w; }
int snm_p[maxn];
int get(int v) { return snm_p[v] == v ? v : (snm_p[v] = get(snm_p[v])); }
void unite(int a, int b) {
  a = get(a);
  b = get(b);
  if (a == b) return;
  if (rand() & 1) swap(a, b);
  snm_p[b] = a;
}
const int maxlog = 19;
vector<edge> g[maxn];
pair<int, int> lca_p[maxlog + 1][maxn];
int up[maxlog + 1][maxn];
int h[maxn];
int timer = 1;
int tin[maxn], tout[maxn];
const int inf = 1000000000 + 1;
void dfs(int v, int p = 1, pair<int, int> add = make_pair(-1, -1),
         int cur_h = 0) {
  h[v] = cur_h;
  tin[v] = timer++;
  up[0][v] = p;
  lca_p[0][v] = add;
  for (int i = 1; i <= maxlog; ++i) {
    up[i][v] = up[i - 1][up[i - 1][v]];
    lca_p[i][v] = max(lca_p[i - 1][v], lca_p[i - 1][up[i - 1][v]]);
  }
  for (int i = 0; i < g[v].size(); ++i) {
    int tv = g[v][i].a == v ? g[v][i].b : g[v][i].a;
    if (tv != p) dfs(tv, v, make_pair(g[v][i].w, g[v][i].ind), cur_h + 1);
  }
  tout[v] = timer++;
}
bool upper(int a, int b) { return tin[a] <= tin[b] && tout[a] >= tout[b]; }
int lca(int a, int b) {
  if (upper(a, b)) return a;
  if (upper(b, a)) return b;
  for (int i = maxlog; i >= 0; --i)
    if (!upper(up[i][a], b)) {
      a = up[i][a];
    }
  return up[0][a];
}
pair<int, int> count_path(int a, int h) {
  pair<int, int> ans = make_pair(-1, -1);
  for (int i = maxlog; i >= 0; --i) {
    if ((1 << i) <= h) {
      ans = max(ans, lca_p[i][a]);
      a = up[i][a];
      h -= 1 << i;
    }
  }
  return ans;
}
pair<int, int> find_worst(int a, int b) {
  int c = lca(a, b);
  return max(count_path(a, h[a] - h[c]), count_path(b, h[b] - h[c]));
}
int main() {
  ios_base::sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) snm_p[i] = i;
  vector<int> w(m), c(m);
  for (int i = 0; i < m; ++i) cin >> w[i];
  for (int i = 0; i < m; ++i) cin >> c[i];
  vector<edge> all;
  for (int i = 0; i < m; ++i) {
    int a, b;
    cin >> a >> b;
    all.push_back(edge(a, b, w[i], c[i], i));
  }
  vector<edge> start = all;
  int s;
  cin >> s;
  sort(all.begin(), all.end(), cmp);
  set<int> minost;
  for (int i = 0; i < m; ++i) {
    int a = all[i].a, b = all[i].b;
    if (get(a) != get(b)) {
      unite(a, b);
      minost.insert(all[i].ind);
    }
  }
  for (auto it : minost) {
    int a, b, w;
    a = start[it].a;
    b = start[it].b;
    g[a].push_back(start[it]);
    g[b].push_back(start[it]);
  }
  dfs(1);
  long long sum = 0;
  int best_edge;
  int best_c = inf;
  for (auto it : minost) {
    sum += start[it].w;
    if (start[it].c < best_c) {
      best_c = start[it].c;
      best_edge = it;
    }
  }
  long long best_sum = sum - s / start[best_edge].c;
  int add = -1, del = -1;
  for (int i = 0; i < m; ++i) {
    if (minost.find(i) != minost.end()) continue;
    int a = start[i].a;
    int b = start[i].b;
    int w = start[i].w;
    int c = start[i].c;
    pair<int, int> worst = find_worst(a, b);
    if (sum - worst.first + w - s / c < best_sum) {
      best_sum = sum - worst.first + w - s / c;
      add = i;
      del = worst.second;
      best_edge = i;
    }
  }
  start[best_edge].w -= s / start[best_edge].c;
  minost.insert(add);
  minost.erase(del);
  cout << best_sum << endl;
  for (auto it : minost) cout << it + 1 << " " << start[it].w << endl;
  return 0;
}
