#include<map>
#include<set>
#include<stack>
#include<cmath>
#include<queue>
#include<bitset>
#include<math.h>
#include<vector>
#include<string>
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<algorithm>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
const db eps=1e-9;
const int N=2e5+10;
const int M=4e5+10;
const ll MOD=1000000007;
const int mod=10007;
const int MAX=1000000010;
const double pi=acos(-1.0);
int tot,u[N],v[M],q[M],pre[M];
struct Edge{
int a,b,c,id;
}edge[M];
int w[M],c[M],f[N],bo[M];
bool cmd(Edge x,Edge y) {
return x.c<y.c;
}
int find_fa(int x) {
return f[x]==x ? x:f[x]=find_fa(f[x]);
}
void add(int x,int y,int z) {
v[tot]=y;q[tot]=z;pre[tot]=u[x];u[x]=tot++;
v[tot]=x;q[tot]=z;pre[tot]=u[y];u[y]=tot++;
}
int fa[N][20],mxx[N][20],deep[N];
void dfs(int x,int y,int z) {
deep[x]=deep[y]+1;
fa[x][0]=y;mxx[x][0]=z;
for (int i=1;i<20;i++)
if (deep[x]-(1<<i)<=0) break ;
else {
fa[x][i]=fa[fa[x][i-1]][i-1];
if (w[mxx[x][i-1]]<=w[mxx[fa[x][i-1]][i-1]]) mxx[x][i]=mxx[fa[x][i-1]][i-1];
else mxx[x][i]=mxx[x][i-1];
}
for (int i=u[x];~i;i=pre[i])
if (v[i]!=y) dfs(v[i],x,q[i]);
}
int getmx(int x,int y) {
if (deep[x]<deep[y]) swap(x,y);
int i,ret=0,mx=0;
for (i=20;i>=0;i--)
if (deep[x]-(1<<i)>=deep[y]) {
if (w[mxx[x][i]]>mx) mx=w[mxx[x][i]],ret=mxx[x][i];
x=fa[x][i];
}
if (x==y) return ret;
for (i=20;i>=0;i--)
if (deep[x]-(1<<i)>0&&fa[x][i]!=fa[y][i]) {
if (w[mxx[x][i]]>mx) mx=w[mxx[x][i]],ret=mxx[x][i];
if (w[mxx[y][i]]>mx) mx=w[mxx[y][i]],ret=mxx[y][i];
x=fa[x][i];y=fa[y][i];
}
if (w[mxx[x][0]]>mx) mx=w[mxx[x][0]],ret=mxx[x][0];
if (w[mxx[y][0]]>mx) mx=w[mxx[y][0]],ret=mxx[y][0];
return ret;
}
int main()
{
int i,j,k,n,m,big,del,faa,fbb;
ll s,mx,sum;
scanf("%d%d", &n, &m);
for (i=1;i<=m;i++) scanf("%d", &w[i]);
for (i=1;i<=m;i++) scanf("%d", &c[i]);
for (i=1;i<=m;i++) {
scanf("%d%d", &edge[i].a, &edge[i].b);
edge[i].c=w[i];edge[i].id=i;
}
scanf("%I64d", &s);
sort(edge+1,edge+m+1,cmd);
for (i=1;i<=n;i++) f[i]=i;
k=tot=sum=0;c[0]=MAX;
memset(u,-1,sizeof(u));
memset(bo,0,sizeof(bo));
for (i=1;i<=m;i++) {
faa=find_fa(edge[i].a);
fbb=find_fa(edge[i].b);
if (faa!=fbb) {
bo[edge[i].id]=1;
if (c[edge[i].id]<c[k]) k=edge[i].id;
f[faa]=fbb;sum+=(ll)edge[i].c;
add(edge[i].a,edge[i].b,edge[i].id);
}
}
deep[0]=0;dfs(1,0,0);
del=0;mx=sum-s/c[k];
for (i=1;i<=m;i++)
if (!bo[edge[i].id]) {
big=getmx(edge[i].a,edge[i].b);
if (sum-w[big]+edge[i].c-s/c[edge[i].id]<mx) {
mx=sum-w[big]+edge[i].c-s/c[edge[i].id];
k=edge[i].id;del=big;
}
}
printf("%I64d\n", mx);
for (i=1;i<=m;i++)
if ((bo[edge[i].id]&&del!=edge[i].id)||(!bo[edge[i].id]&&k==edge[i].id)) {
if (k==edge[i].id) printf("%d %d\n", edge[i].id, edge[i].c-s/c[k]);
else printf("%d %d\n", edge[i].id, edge[i].c);
}
return 0;
}