#include <bits/stdc++.h>   using namespace std;   const long long N = 3e5 + 100;   const long long big = 1e18;   const long long block = 800;   const long long mod = 1e6;   bool fans = 0;   long long n, m;   long long w[N];   long long c[N];   vector<pair<long long, long long> > g[N], supans;   vector<pair<pair<long long, long long>, pair<long long, long long> > > gr;   vector<long long> ba, go;   long long p[N];   long long full;   vector<pair<long long, long long> > grph;   long long fnd(long long a) { return p[a] = (p[a] == a ? a : fnd(p[a])); }   void unt(long long a, long long b, long long i) {     long long v = a, u = b;     a = fnd(a), b = fnd(b);     if (a == b) {       if (!fans) ba.push_back(i);       return;     }     if (fans) supans.push_back({i, w[i]});     if (!fans) {       go.push_back(i);       g[v].push_back({u, i}), g[u].push_back({v, i});     }     p[b] = a;     full += w[i];   }   long long tin[N], tout[N], tmr;   long long kth[N][21];   pair<long long, long long> mx[N][21];   void dfs(long long v = 1, long long pr = 0, long long reb = 0) {     kth[v][0] = pr;     tin[v] = ++tmr;     mx[v][0] = {w[reb], reb};     for (int i = 1; i <= 20; i++)       kth[v][i] = kth[kth[v][i - 1]][i - 1],       mx[v][i] = max(mx[v][i - 1], mx[kth[v][i - 1]][i - 1]);     for (auto u : g[v])       if (u.first != pr) dfs(u.first, v, u.second);     tout[v] = tmr;   }   bool upper(long long a, long long b) {     return (tin[a] <= tin[b] && tout[b] <= tout[a]);   }   long long LCA(long long a, long long b) {     if (upper(a, b)) return a;     if (upper(b, a)) return b;     for (int i = 20; i >= 0; i--) {       if (!upper(kth[a][i], b)) a = kth[a][i];     }     return kth[a][0];   }   pair<long long, long long> qu(long long a, long long b) {     long long lca = LCA(a, b);     pair<long long, long long> sub = {0, 0};     long long t = 2;     while (t--) {       if (lca != a) {         for (int i = 20; i >= 0; i--) {           if (!upper(kth[a][i], lca)) sub = max(mx[a][i], sub), a = kth[a][i];         }         sub = max(sub, mx[a][0]);       }       swap(a, b);     }     return sub;   }   int main() {     tout[0] = big;     cin >> n >> m;     for (int i = 1; i <= m; i++) cin >> w[i];     for (int i = 1; i <= m; i++) cin >> c[i];     for (int i = 1, a, b; i <= m; i++) {       cin >> a >> b;       grph.push_back({a, b});       gr.push_back({{w[i], i}, {a, b}});     }     for (int i = 1; i <= n; i++) p[i] = i;     long long S;     cin >> S;     sort((gr).begin(), (gr).end());     for (auto u : gr) unt(u.second.first, u.second.second, u.first.second);     dfs();     pair<long long, long long> ans = {big, 0};     for (auto u : go) {       pair<long long, long long> zzzz = {full - S / c[u], u};       ans = min(ans, zzzz);     }     for (auto u : ba) {       pair<long long, long long> h = grph[u - 1];       long long z = w[u] - (S / c[u]);       h = qu(h.first, h.second);       if (h.first > z)         ans = min(ans, pair<long long, long long>({full - h.first + z, u}));     }     w[ans.second] -= S / c[ans.second];     for (int i = 0; i < gr.size(); i++) {       if (gr[i].first.second == ans.second) gr[i].first.first = w[ans.second];     }     for (int i = 1; i <= n; i++) p[i] = i;     sort((gr).begin(), (gr).end());     fans = 1;     for (auto u : gr) {       unt(u.second.first, u.second.second, u.first.second);     }     cout << ans.first <<   n ;     for (auto u : supans) cout << u.first <<     << u.second <<   n ;   }