#include <bits/stdc++.h>   using namespace std;   const long long N = 4e5 + 5;   const long long M = 1e6 + 5;   const long long inf = 1e18;   const long long eps = 1e-5;   inline long long read() {     long long s = 0;     register bool neg = 0;     register char c = getchar();     for (; c <  0  || c >  9 ; c = getchar()) neg |= (c ==  - );     for (; c >=  0  && c <=  9 ; s = s * 10 + (c ^ 48), c = getchar())       ;     s = (neg ? -s : s);     return s;   }   long long a, b, c, fa[N][21], mx[N][21], F[N], dep[N], C[N];   bool vis[N];   struct node {     long long x, y, val, real, id;     bool vis;     bool operator<(const node &o) const { return val < o.val; }   } s[N];   vector<pair<long long, long long> > st[N];   inline long long f(long long n) { return F[n] == n ? n : F[n] = f(F[n]); }   inline void dfs(long long n, long long lst, long long p) {     dep[n] = dep[lst] + 1;     fa[n][0] = lst;     mx[n][0] = p;     for (long long i = (1); i <= (20); ++i) {       fa[n][i] = fa[fa[n][i - 1]][i - 1];       mx[n][i] = max(mx[n][i - 1], mx[fa[n][i - 1]][i - 1]);     }     for (long long i = (0); i <= (((long long)((st[n]).size())) - 1); ++i) {       long long v = st[n][i].first;       if (v == lst) continue;       dfs(v, n, st[n][i].second);     }   }   inline long long LCA(long long n, long long m) {     if (dep[n] < dep[m]) swap(n, m);     long long res = -inf;     for (long long i = (20); i >= (0); --i)       if (dep[fa[n][i]] >= dep[m]) {         res = max(res, mx[n][i]);         n = fa[n][i];       }     if (n == m) return res;     for (long long i = (20); i >= (0); --i)       if (fa[n][i] != fa[m][i]) {         res = max(res, max(mx[n][i], mx[m][i]));         n = fa[n][i];         m = fa[m][i];       }     res = max(res, max(mx[n][0], mx[m][0]));     return res;   }   inline void del(long long n, long long m) {     vis[n] = vis[m] = 1;     while (n != m) {       if (dep[n] <= dep[m])         m = fa[m][0];       else         n = fa[n][0];       vis[n] = vis[m] = 1;     }   }   signed main() {     memset(mx, -0x3f, sizeof(mx));     a = read();     b = read();     for (long long i = (1); i <= (a); ++i) F[i] = i;     for (long long i = (1); i <= (b); ++i) s[i].val = read();     for (long long i = (1); i <= (b); ++i) C[i] = read();     for (long long i = (1); i <= (b); ++i) {       s[i].x = read();       s[i].y = read();       s[i].id = i;     }     c = read();     for (long long i = (1); i <= (b); ++i) s[i].real = s[i].val - c / C[i];     sort(s + 1, s + b + 1);     long long mn = 1, ans = 0, a1, a2 = inf, t1, t2, t3, mn1;     for (long long i = (1); i <= (b); ++i) {       long long f1 = f(s[i].x), f2 = f(s[i].y);       if (f1 == f2) continue;       F[f1] = f2;       ans += s[i].val;       if (s[i].real - s[i].val < s[mn].real - s[mn].val) mn = i;       s[i].vis = 1;       st[s[i].x].push_back(make_pair(s[i].y, s[i].val));       st[s[i].y].push_back(make_pair(s[i].x, s[i].val));     }     a1 = ans + s[mn].real - s[mn].val;     dfs(1, 0, -inf);     for (long long i = (1); i <= (b); ++i) {       if (s[i].vis) continue;       long long tmp = LCA(s[i].x, s[i].y);       if (ans - tmp + s[i].real < a2) {         a2 = ans - tmp + s[i].real;         t3 = tmp;         t1 = s[i].x, t2 = s[i].y;         mn1 = i;       }     }     printf( %lld n , min(a1, a2));     if (a1 < a2) {       for (long long i = (1); i <= (b); ++i)         if (s[i].vis) {           if (mn == i)             printf( %lld %lld n , s[i].id, s[i].real);           else             printf( %lld %lld n , s[i].id, s[i].val);         }     } else {       del(t1, t2);       for (long long i = (1); i <= (b); ++i) {         if (!s[i].vis) continue;         if (t1 && vis[s[i].x] && vis[s[i].y] && s[i].val == t3)           t1 = 0;         else           printf( %lld %lld n , s[i].id, s[i].val);       }       printf( %lld %lld n , s[mn1].id, s[mn1].real);     }     return 0;   }