#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 100, LG = 19;
struct edge {
  int u, v, w, c, i, in;
  bool operator<(const edge &b) const { return w < b.w; }
} arr[N];
vector<pair<int, int> > adj[N];
int ST[N][LG], mx[N][LG], in[N], out[N];
bool isAncestor(int u, int v) { return in[v] >= in[u] && out[v] <= out[u]; }
void go(int &ret, int i) {
  if (ret == -1 || arr[ret].w < arr[i].w) ret = i;
}
int solve(int u, int v) {
  int ret = -1;
  for (int j = LG - 1; j >= 0; j--) {
    if (ST[u][j] && !isAncestor(ST[u][j], v)) {
      go(ret, mx[u][j]);
      u = ST[u][j];
    }
  }
  for (int j = LG - 1; j >= 0; j--) {
    if (ST[v][j] && !isAncestor(ST[v][j], u)) {
      go(ret, mx[v][j]);
      v = ST[v][j];
    }
  }
  if (!isAncestor(u, v)) go(ret, mx[u][0]);
  if (!isAncestor(v, u)) go(ret, mx[v][0]);
  return ret;
}
int t;
void dfs(int cur, int from = 0) {
  in[cur] = t++;
  ST[cur][0] = from;
  for (int j = 1; j < LG; ++j) {
    ST[cur][j] = ST[ST[cur][j - 1]][j - 1];
    mx[cur][j] = mx[cur][j - 1];
    int to = ST[cur][j - 1];
    if (to) go(mx[cur][j], mx[to][j - 1]);
  }
  for (int i = 0; i < adj[cur].size(); ++i)
    if (adj[cur][i].first != from) {
      mx[adj[cur][i].first][0] = adj[cur][i].second;
      dfs(adj[cur][i].first, cur);
    }
  out[cur] = t++;
}
int p[N];
int findSet(int i) { return (i == p[i] ? i : p[i] = findSet(p[i])); }
int n, m, s;
int main() {
  scanf("%d", &n), scanf("%d", &m);
  for (int i = 0; i < m; ++i) scanf("%d", &arr[i].w);
  for (int i = 0; i < m; ++i) scanf("%d", &arr[i].c);
  for (int i = 0; i < m; ++i) {
    scanf("%d", &arr[i].u);
    scanf("%d", &arr[i].v);
    arr[i].i = i + 1;
    arr[i].in = 0;
  }
  scanf("%d", &s);
  for (int i = 1; i <= n; i++) p[i] = i;
  sort(arr, arr + m);
  long long sum = 0;
  for (int i = 0; i < m; ++i) {
    int ru = findSet(arr[i].u);
    int rv = findSet(arr[i].v);
    if (ru == rv) continue;
    arr[i].in = 1;
    p[ru] = rv;
    sum += arr[i].w;
    adj[arr[i].u].push_back(pair<int, int>(arr[i].v, i));
    adj[arr[i].v].push_back(pair<int, int>(arr[i].u, i));
  }
  dfs(1);
  int be = -1, re = -1;
  long long delta = 1e18;
  for (int i = 0; i < m; ++i) {
    int j = solve(arr[i].u, arr[i].v);
    if (arr[i].w - arr[j].w - s / arr[i].c < delta) {
      be = i, re = j;
      delta = arr[i].w - arr[j].w - s / arr[i].c;
    }
  }
  cout << sum + delta << endl;
  for (int i = 0; i < m; ++i) {
    if ((arr[i].in && re != i) || i == be) {
      printf("%d ", arr[i].i);
      if (i == be)
        printf("%d\n", arr[i].w - s / arr[i].c);
      else
        printf("%d\n", arr[i].w);
    }
  }
}
