调了好久,不理解为什么越界awa
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
struct node{
int u,v,w,c,idx,nxt,st;
}e[N<<1];
struct edge{
int v,w;
};
int n,m,s;
int fa[N];
int f[N][25];
vector<edge>g[N];
int d[N];
int maxw[N][25];
int sum,minc,iminc;
bool cmp(node a,node b){
return a.w<b.w;
}
void dfs(int u,int fa,int w){
f[u][0]=fa;
d[u]=d[fa]+1;
maxw[u][0]=w;
for(int i=1;(1<<i)<=n;i++){
f[u][i]=f[f[u][i-1]][i-1];
if(maxw[u][i-1]>=0)maxw[u][i]=max(maxw[u][i-1],maxw[maxw[u][i-1]][i-1]);
}
for(int i=0;i<g[u].size();i++){
int v=g[u][i].v;
if(v!=fa){
dfs(v,u,g[u][i].w);
}
}
return;
}
int LCA(int x,int y){
if(d[x]>d[y]){
swap(x,y);
}
for(int i=20;i>=0;i--){
if(d[x]<=d[y]-(1<<i)){
y=f[y][i];
}
}
if(x==y){
return x;
}
for(int i=20;i>=0;i--){
if(f[x][i]==f[y][i]){
continue;
}
x=f[x][i],y=f[y][i];
}
return f[x][0];
}
int LCA_C(int u,int v){
int ans=0;
if(d[u]>d[v])swap(u,v);
for(int i=20;i>=0;i--){
if(d[u]<=d[v]-(1<<i)){
ans=max(ans,maxw[v][i]);
v=f[v][i];
}
}
if(u==v)return ans;
for(int i=20;i>=0;i--){
if(f[u][i]==f[v][i])continue;
ans=max(ans,max(maxw[u][i],maxw[v][i]));
u=f[u][i],v=f[v][i];
}
return max(ans,max(maxw[u][0],maxw[v][0]));
}
bool check(int a,int b,int c){
int x=LCA(a,b);
int y=LCA(b,c);
int z=LCA(a,c);
if(x==y&&z==c)return 1;
if(x==z&&y==c)return 1;
return 0;
}
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
void print(int x){
if(x<0){
x=-x;
putchar('-');
}
if(x>9){
print(x/10);
}
putchar(x%10+'0');
return;
}
int find(int x){
while(x!=fa[x]){
x=fa[x]=fa[fa[x]];
}
return x;
}
void kruskal(){
sort(e+1,e+1+m,cmp);
sum=0,minc=1e9,iminc=0;
for(int i=1;i<=m;i++){
int u=e[i].u,v=e[i].v,w=e[i].w,c=e[i].c;
if(find(u)==find(v)){
continue;
}
if(c<minc){
e[i].st=2;
e[iminc].st=1;
minc=c;
iminc=i;
}
else e[i].st=1;
fa[find(u)]=find(v);
sum+=w;
g[u].push_back({v,w});
g[v].push_back({u,w});
}
}
signed main(){
n=read();
m=read();
for(int i=1;i<=m;i++)e[i].w=read();
for(int i=1;i<=m;i++)e[i].c=read();
for(int i=1;i<=m;i++){
int a=read(),b=read();
e[i].u=a;
e[i].v=b;
e[i].idx=i;
e[i].st=0;
}
for(int i=1;i<=n;i++){
fa[i]=i;
}
s=read();
kruskal();
int ans=sum,add=0;
if(minc)sum-=s/minc;
dfs(1,0,0);
for(int i=1;i<=m;i++){
int u=e[i].u,v=e[i].v,w=e[i].w,c=e[i].c;
if(!e[i].st){
if(c<minc){
int num=0;
if(c)num=ans-LCA_C(u,v)+w-s/c;
if(num<sum){
add=i;
sum=num;
}
}
}
}
print(sum);
cout<<"\n";
if(!add){
for(int i=1;i<=m;i++){
if(e[i].st==1)cout<<e[i].idx<<' '<<e[i].w<<"\n";
if(e[i].st==2&&e[i].c)cout<<e[i].idx<<' '<<e[i].w-s/e[i].c<<"\n";
}
}
else{
int u=e[add].u,v=e[add].v;
bool flag=1;
for(int i=1;i<=m;i++){
if(i==add){
if(e[i].c)cout<<e[i].idx<<' '<<e[i].w-s/e[i].c<<"\n";
}
if(e[i].st){
if(e[i].w==LCA_C(u,v)&&check(u,v,e[i].u)&&check(u,v,e[i].v)&&flag){
flag=0;
continue;
}
cout<<e[i].idx<<' '<<e[i].w<<"\n";
}
}
}
return 0;
}