并查集乱搞的构造
竟然因为return printf的返回值 无限RE
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
if (p1==p2) { p2=(p1=buf)+fread(buf,1,10000,stdin); if (p1==p2) return EOF; }
return *p1++;
}
inline void read(int &x){
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
const int N=200005;
struct edge{
int u,v;
edge(int u=0,int v=0):u(u),v(v) {}
}E[N<<1],Ans[N<<1];
int cnt;
#define U E[i].u
#define V E[i].v
int fat[N],rnk[N];
inline void init(int n){
for (int i=1;i<=n;i++) fat[i]=i,rnk[i]=0;
}
inline int Fat(int u){
return u==fat[u]?u:fat[u]=Fat(fat[u]);
}
inline int Merge(int x,int y){
x=Fat(x),y=Fat(y); if (x==y) return 0;
if (rnk[x]>rnk[y]) swap(x,y);
if (rnk[x]==rnk[y]) rnk[y]++;
fat[x]=y; return 1;
}
int n,m,st,s,t,ds,dt;
int ls[N],lt[N],ps[N],pt[N];
int lst[N],pst[N],sum;
inline void Print(){
printf("Yes\n");
for (int i=1;i<n;i++)
printf("%d %d\n",Ans[i].u,Ans[i].v);
}
int main(){
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
int iu,iv;
read(n); read(m);
for (int i=1;i<=m;i++)
read(U),read(V);
read(s); read(t); read(ds); read(dt);
init(n);
for (int i=1;i<=m;i++){
if ((U==s && V==t) || (U==t && V==s))
st=1;
if (U!=s && V!=s && U!=t && V!=t)
if (Merge(U,V))
Ans[++cnt]=E[i];
}
for (int i=1;i<=m;i++){
if (U==s && V!=t) ls[Fat(V)]=1,ps[Fat(V)]=V;
if (V==s && U!=t) ls[Fat(U)]=1,ps[Fat(U)]=U;
if (U==t && V!=s) lt[Fat(V)]=1,pt[Fat(V)]=V;
if (V==t && U!=s) lt[Fat(U)]=1,pt[Fat(U)]=U;
}
for (int i=1;i<=n;i++)
if (Fat(i)==i){
if (ls[i] && !lt[i]) ds--,Merge(s,ps[i]),Ans[++cnt]=edge(s,ps[i]);
if (lt[i] && !ls[i]) dt--,Merge(t,pt[i]),Ans[++cnt]=edge(t,pt[i]);
if (ls[i] && lt[i]) lst[++sum]=i;
}
if (ds<=0 || dt<=0)
return printf("No\n"),0;
if (!sum){
Merge(s,t);
Ans[++cnt]=edge(s,t);
Print();
}
else if (sum<=ds+dt-1){
int pnt=1;
while (pnt<=sum-1 && ds>1)
ds--,Merge(s,ps[lst[pnt]]),Ans[++cnt]=edge(s,ps[lst[pnt]]),pnt++;
while (pnt<=sum-1 && dt>1)
dt--,Merge(t,pt[lst[pnt]]),Ans[++cnt]=edge(t,pt[lst[pnt]]),pnt++;
if (pnt!=sum)
return printf("No\n"),0;
Merge(s,ps[lst[sum]]),Ans[++cnt]=edge(s,ps[lst[sum]]);
Merge(t,pt[lst[sum]]),Ans[++cnt]=edge(t,pt[lst[sum]]);
Print();
}
else
printf("No\n");
return 0;
}