#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 4;
class uni {
 public:
  int pai[N], size[N];
  int cps;
  uni() {
    memset(pai, -1, sizeof pai);
    memset(size, 0, sizeof size);
  }
  uni(int n) {
    memset(pai, -1, sizeof pai);
    memset(size, 0, sizeof size);
    cps = n;
  }
  int find(int u) {
    if (pai[u] == -1)
      return u;
    else
      return pai[u] = find(pai[u]);
  }
  bool une(int u, int v) {
    u = find(u);
    v = find(v);
    if (u == v) return false;
    if (size[u] < size[v]) swap(u, v);
    pai[v] = u;
    size[u] += size[v];
    size[v] = 0;
    cps--;
    return true;
  }
  int comps() { return cps; }
};
struct edge {
  long long w, c;
  int u, v;
};
int n, m;
int s;
vector<pair<int, int> > edg;
edge e[N];
long long res, r;
vector<pair<int, long long> > adj[N];
const int LOG = 20;
vector<int> g[N], p[N];
int pai[N][LOG], peso[N][LOG];
int dist[N];
class LCA {
 public:
  LCA() { memset(peso, 0, sizeof peso); }
  void build(int curr) {
    for (int i = 1; i < LOG; i++) {
      pai[curr][i] = pai[pai[curr][i - 1]][i - 1];
      peso[curr][i] = max(peso[curr][i - 1], peso[pai[curr][i - 1]][i - 1]);
    }
  }
  void ini(int curr, int last, int d) {
    dist[curr] = d;
    pai[curr][0] = last;
    build(curr);
    for (unsigned int i = 0; i < g[curr].size(); i++) {
      int next = g[curr][i];
      if (next == last) continue;
      peso[next][0] = p[curr][i];
      ini(next, curr, d + 1);
    }
  }
  int query(int u, int v) {
    int ret = 0;
    if (dist[v] < dist[u]) swap(v, u);
    int x = dist[v] - dist[u];
    for (int i = 0; i < LOG; i++) {
      if (x & (1 << i)) {
        ret = max(ret, peso[v][i]);
        v = pai[v][i];
      }
    }
    if (u == v) return ret;
    for (int i = LOG - 1; i >= 0; i--) {
      if (pai[u][i] != pai[v][i]) {
        ret = max(ret, peso[u][i]);
        ret = max(ret, peso[v][i]);
        u = pai[u][i];
        v = pai[v][i];
      }
    }
    ret = max(ret, peso[u][0]);
    ret = max(ret, peso[v][0]);
    return ret;
  }
};
void kruskal() {
  sort(edg.begin(), edg.end());
  uni U;
  for (int i = 0; i < (int)edg.size(); i++) {
    int j = edg[i].second;
    int u = e[j].u, v = e[j].v;
    long long dist = edg[i].first;
    if (U.une(u, v)) {
      g[u].push_back(v);
      p[u].push_back(dist);
      g[v].push_back(u);
      p[v].push_back(dist);
      res += dist;
    }
  }
  LCA lca;
  lca.ini(1, -1, 0);
  r = res;
  int idres = -1;
  long long distres;
  for (int i = 0; i < (int)edg.size(); i++) {
    int j = edg[i].second;
    int u = e[j].u, v = e[j].v;
    long long dist = e[j].w;
    long long c = e[j].c;
    long long tira = lca.query(u, v);
    long long rr = r;
    rr -= tira;
    long long x = s / c;
    dist -= x;
    rr += dist;
    if (rr < res) {
      idres = j;
      distres = dist;
      res = rr;
    }
  }
  if (idres != -1) e[idres].w = distres;
  for (int i = 0; i < (int)edg.size(); i++)
    if (edg[i].second == idres) edg[i].first = distres;
  sort(edg.begin(), edg.end());
  cout << res << endl;
  U = uni();
  for (int i = 0; i < (int)edg.size(); i++) {
    int j = edg[i].second;
    int u = e[j].u, v = e[j].v;
    long long dist = edg[i].first;
    if (U.une(u, v)) {
      cout << j + 1 << " " << dist << endl;
    }
  }
}
int main(void) {
  ios_base::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 0; i < m; i++) cin >> e[i].w;
  for (int i = 0; i < m; i++) cin >> e[i].c;
  for (int i = 0; i < m; i++) {
    cin >> e[i].u >> e[i].v;
    long long dist = e[i].w;
    int u = e[i].u, v = e[i].v;
    adj[u].push_back(make_pair(v, dist));
    adj[v].push_back(make_pair(u, dist));
  }
  for (int i = 0; i < m; i++) edg.push_back(make_pair(e[i].w, i));
  cin >> s;
  kruskal();
  return 0;
}
