#include <bits/stdc++.h>
using namespace std;
void Read(int &x) {
  x = 0;
  char c;
  bool flag = 0;
  while (c = getchar(), c != EOF && (c < '0' || c > '9') && c != '-')
    ;
  if (c == '-') {
    flag = 1;
    c = getchar();
  }
  x = c - '0';
  while (c = getchar(), c != EOF && c >= '0' && c <= '9') x = x * 10 + c - '0';
  if (flag == 1) x = -x;
}
void Read(long long &x) {
  x = 0;
  char c;
  bool flag = 0;
  while (c = getchar(), c != EOF && (c < '0' || c > '9') && c != '-')
    ;
  if (c == '-') {
    flag = 1;
    c = getchar();
  }
  x = c - '0';
  while (c = getchar(), c != EOF && c >= '0' && c <= '9')
    x = x * 10ll + c - '0';
  if (flag == 1) x = -x;
}
struct node {
  int u, v, val, c, id;
  bool operator<(const node a) const { return a.val > val; }
} l[200010];
vector<int> a[200010], w[200010];
int maxv[200010][25], f[200010][25], de[200010], n, m;
int vis[200010], fa[200010];
int get_fa(int x) {
  if (fa[x] == 0) return x;
  fa[x] = get_fa(fa[x]);
  return fa[x];
}
void dfs(int x, int fx, int sx, int deep) {
  f[x][0] = fx;
  maxv[x][0] = sx;
  vis[x] = 1;
  de[x] = deep;
  for (int i = 0; i < a[x].size(); i++)
    if (vis[a[x][i]] == 0) dfs(a[x][i], x, w[x][i], deep + 1);
}
void prepare() {
  dfs(1, 0, 0, 1);
  for (int i = 1; i < 21; i++)
    for (int j = 1; j <= n; j++) {
      f[j][i] = f[f[j][i - 1]][i - 1];
      maxv[j][i] = max(maxv[f[j][i - 1]][i - 1], maxv[j][i - 1]);
    }
}
int lca(int x, int y) {
  int x1 = x;
  int y1 = y;
  if (de[x] < de[y]) swap(x, y);
  int maxd = 0;
  for (int i = 20; i >= 0; i--)
    if (de[x] >= de[y] + (1 << i)) {
      maxd = max(maxd, maxv[x][i]);
      x = f[x][i];
    }
  if (x == y) return maxd;
  for (int i = 20; i >= 0; i--)
    if (f[x][i] != f[y][i]) {
      maxd = max(maxd, maxv[x][i]);
      maxd = max(maxd, maxv[y][i]);
      x = f[x][i];
      y = f[y][i];
    }
  maxd = max(maxd, maxv[x][0]);
  maxd = max(maxd, maxv[y][0]);
  return maxd;
}
long long check(int x, int y, long long s) {
  int maxd = lca(x, y);
  return s - maxd;
}
int main() {
  Read(n), Read(m);
  for (int i = 1; i <= m; i++) Read(l[i].val);
  for (int i = 1; i <= m; i++) Read(l[i].c);
  for (int i = 1; i <= m; i++) {
    Read(l[i].u), Read(l[i].v);
    l[i].id = i;
  }
  long long s;
  Read(s);
  sort(l + 1, l + 1 + m);
  long long ans = 0;
  for (int i = 1; i <= m; i++) {
    int x = get_fa(l[i].u);
    int y = get_fa(l[i].v);
    if (x != y) {
      fa[x] = y;
      a[l[i].u].push_back(l[i].v);
      a[l[i].v].push_back(l[i].u);
      w[l[i].u].push_back(l[i].val);
      w[l[i].v].push_back(l[i].val);
      ans = ans + 1ll * l[i].val;
    }
  }
  long long ans1 = ans;
  int spe = -1;
  prepare();
  for (int i = 1; i <= m; i++) {
    long long res = check(l[i].u, l[i].v, l[i].val - (s / (1ll * l[i].c)));
    if (res + ans < ans1) {
      ans1 = res + ans;
      spe = i;
    }
  }
  memset(fa, 0, sizeof fa);
  ans = ans1;
  if (spe != -1) {
    l[spe].val = l[spe].val - (s / l[spe].c);
    sort(l + 1, l + 1 + m);
  }
  printf("%I64d\n", ans);
  for (int i = 1; i <= m; i++) {
    int x = get_fa(l[i].u);
    int y = get_fa(l[i].v);
    if (x != y) {
      fa[x] = y;
      printf("%d %d\n", l[i].id, l[i].val);
    }
  }
}
