#include <bits/stdc++.h>   using namespace std;   const int MAXN = int(2e5 + 5);   int n, m, S;   int POW[25];   int f[MAXN];   bool vis[MAXN];   bool flag[MAXN];   long long tmp, tot, Ans, t;   struct edge {     int u, v, id;     int w, c;   } e[MAXN];   struct node {     int to, id;     node() {}     node(int T, int I) : to(T), id(I) {}   };   vector<node> G[MAXN];   void Addedge(int u, int v, int id) {     G[u].push_back(node(v, id));     G[v].push_back(node(u, id));   }   void Init() {     POW[0] = 1;     for (int i = 1; i <= 25; i++) POW[i] = 2 * POW[i - 1];   }   int Find(int x) { return x == f[x] ? x : f[x] = Find(f[x]); }   bool cmp(edge a, edge b) { return a.w < b.w; }   bool cmp2(edge a, edge b) { return a.id < b.id; }   void Kruskal() {     sort(e + 1, e + m + 1, cmp);     for (int i = 1; i <= n; i++) f[i] = i;     t = 0;     e[0].c = int(1e9 + 5);     for (int i = 1; i <= m; i++) {       int u = e[i].u, v = e[i].v;       int fx = Find(u), fy = Find(v);       if (fx != fy) {         Addedge(u, v, i);         f[fx] = fy;         vis[i] = 1;         tmp += e[i].w;         if (e[i].c < e[t].c) t = i;       }     }     tot = tmp;     tmp -= S / e[t].c;   }   int MaxId(int a, int b) { return (e[a].w < e[b].w) ? b : a; }   int Max[MAXN][25 + 5];   int fa[MAXN][25 + 5];   int dep[MAXN];   void Dfs(int u) {     for (int i = 1; i <= 25; i++) {       fa[u][i] = fa[fa[u][i - 1]][i - 1];       Max[u][i] = MaxId(Max[u][i - 1], Max[fa[u][i - 1]][i - 1]);     }     for (int i = 0; i < G[u].size(); i++) {       int v = G[u][i].to;       if (v == fa[u][0]) continue;       dep[v] = dep[u] + 1;       Max[v][0] = G[u][i].id;       fa[v][0] = u;       Dfs(v);     }   }   int LCA(int u, int v) {     if (dep[u] < dep[v]) swap(u, v);     int t = dep[u] - dep[v];     for (int i = 0; POW[i] <= t; i++)       if (POW[i] & t) u = fa[u][i];     if (u == v) return u;     for (int i = 25; i >= 0; i--)       if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];     return fa[u][0];   }   int Query(int u, int v) {     int t = dep[u] - dep[v];     int ret = 0;     for (int i = 0; POW[i] <= t; i++)       if (POW[i] & t) {         ret = MaxId(ret, Max[u][i]);         u = fa[u][i];       }     return ret;   }   int main() {     Init();     scanf( %d%d , &n, &m);     for (int i = 1; i <= m; i++) {       e[i].id = i;       scanf( %d , &e[i].w);     }     for (int i = 1; i <= m; i++) scanf( %d , &e[i].c);     for (int i = 1; i <= m; i++) scanf( %d%d , &e[i].u, &e[i].v);     scanf( %d , &S);     Kruskal();     e[0].w = -int(1e9 + 5);     fill(Max[1], Max[1] + 25 + 1, 0);     Dfs(1);     long long Ans = tmp;     int Last = -1, now = -1;     for (int i = 1; i <= m; i++)       if (e[i].c < e[t].c) {         int u = e[i].u, v = e[i].v;         int q = LCA(u, v);         int x = MaxId(Query(u, q), Query(v, q));         tmp = (long long)tot - e[x].w + e[i].w - S / e[i].c;         if (Ans > tmp) {           Ans = tmp;           vis[(Last != -1) ? Last : 0] = 1;           vis[x] = 0;           Last = x;           vis[(now != -1) ? now : 0] = 0;           vis[i] = 1;           now = i;         }       }     printf( %I64d n , Ans);     if (now == -1) now = t;     for (int i = 1; i <= m; i++)       if (vis[i]) {         if (now == i) e[i].w -= S / e[i].c;         flag[e[i].id] = 1;       }     sort(e + 1, e + m + 1, cmp2);     for (int i = 1; i <= m; i++)       if (flag[i]) printf( %d %d n , i, e[i].w);   }