#include <bits/stdc++.h>
using namespace std;
void rf() {}
const int nx[8] = {2, -2, -2, 2, 1, 1, -1, -1};
const int ny[8] = {1, 1, -1, -1, 2, -2, -2, 2};
const int Nx[4] = {0, 0, -1, 1};
const int Ny[4] = {1, -1, 0, 0};
const long long LINF = (long long)5e18;
const int INF = 1e9 + 7;
const int N = 6e5 + 1;
const int SZ = 20;
const int MAXN = 1e6 + 50;
const double EPS = 1e-9, PI = 3.14159265359;
inline int get_int() {
  char x = getchar();
  int ret = 0;
  bool neg = 0;
  while (!('0' <= x && x <= '9')) {
    if (x == '-') neg = 1;
    x = getchar();
  }
  while ('0' <= x && x <= '9') {
    ret = ret * 10 + x - '0';
    x = getchar();
  }
  if (neg) ret *= -1;
  return ret;
}
int n, m;
int pos[N];
int dp[N][SZ], lvl[N];
pair<int, pair<int, int> > mx[N][SZ];
vector<pair<int, int> > ANS;
long long cost = 0;
struct edge {
  int w, c, second, t, id;
};
vector<pair<pair<int, int>, int> > used;
edge e[N];
vector<pair<int, int> > v[N];
struct DSU {
  int n;
  int r[N], p[N], sz[N];
  void init(int _n) {
    n = _n;
    for (int i = 1; i <= n; i++) {
      p[i] = i;
      r[i] = sz[i] = 1;
    }
  }
  int get(int x) { return p[x] == x ? x : p[x] = get(p[x]); }
  void unite(int id) {
    int x = e[id].second, y = e[id].t;
    x = get(x);
    y = get(y);
    if (x == y) return;
    if (r[x] > r[y]) swap(x, y);
    p[x] = y;
    cost += e[id].w;
    used.push_back(make_pair(make_pair(e[id].second, e[id].t), id));
    v[e[id].second].push_back(make_pair(e[id].t, e[id].w));
    v[e[id].t].push_back(make_pair(e[id].second, e[id].w));
    r[y] += (r[x] == r[y]);
    sz[y] += sz[x];
  }
} dsu;
bool cmp(edge x, edge y) { return x.w < y.w; }
void pre_dfs1(int x, int p = -1, int c = -1) {
  if (p != -1) {
    lvl[x] = lvl[p] + 1;
    dp[x][0] = p;
    mx[x][0] = make_pair(c, make_pair(x, p));
    for (int i = 1; i < SZ; i++) {
      mx[x][i] = max(mx[x][i - 1], mx[dp[x][i - 1]][i - 1]);
      dp[x][i] = dp[dp[x][i - 1]][i - 1];
    }
  }
  for (auto it : v[x]) {
    if (it.first == p) continue;
    pre_dfs1(it.first, x, it.second);
  }
}
inline pair<int, pair<int, int> > get(int x, int y) {
  if (lvl[x] > lvl[y]) swap(x, y);
  pair<int, pair<int, int> > ret = make_pair(0, make_pair(0, 0));
  int d = lvl[y] - lvl[x];
  for (int i = 0; i < SZ; i++)
    if ((d >> i) & 1) {
      ret = max(ret, mx[y][i]);
      y = dp[y][i];
    }
  if (x == y) return ret;
  for (int i = SZ - 1; i >= 0; i--)
    if (dp[x][i] != dp[y][i]) {
      ret = max(ret, mx[x][i]);
      ret = max(ret, mx[y][i]);
      x = dp[x][i];
      y = dp[y][i];
    }
  ret = max(ret, mx[x][0]);
  ret = max(ret, mx[y][0]);
  return ret;
}
int main() {
  srand(time(0));
  rf();
  scanf("%d%d", &n, &m);
  dsu.init(n);
  for (int i = 1; i <= m; i++) {
    scanf("%d", &e[i].w);
    e[i].id = i;
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d", &e[i].c);
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &e[i].second, &e[i].t);
  }
  int C;
  scanf("%d", &C);
  sort(e + 1, e + m + 1, cmp);
  for (int i = 1; i <= m; i++) {
    dsu.unite(i);
  }
  pre_dfs1(1);
  long long mn = LINF;
  for (int i = 1; i <= m; i++) {
    mn = min(mn, cost - get(e[i].second, e[i].t).first + e[i].w - (C / e[i].c));
  }
  for (int i = 1; i <= m; i++) {
    pair<int, pair<int, int> > ss = get(e[i].second, e[i].t);
    if (mn == cost - ss.first + e[i].w - (C / e[i].c)) {
      cout << mn << "\n";
      cout << e[i].id << ' ' << e[i].w - (C / e[i].c) << "\n";
      for (auto it : used) {
        if (it.first == ss.second ||
            it.first == make_pair(ss.second.second, ss.second.first))
          continue;
        if (it.first == make_pair(e[i].second, e[i].t) ||
            it.first == make_pair(e[i].t, e[i].second))
          continue;
        cout << e[it.second].id << ' ' << e[it.second].w << "\n";
      }
      return 0;
    }
  }
  return 0;
}
