#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long int LL; typedef pair P; typedef pair LP; const int INF=1<<30; const LL MAX=1e9+7; void array_show(int *array,int array_n,char middle=' '){ for(int i=0;i &vec_s,int vec_n=-1,char middle=' '){ if(vec_n==-1)vec_n=vec_s.size(); for(int i=0;i &vec_s,int vec_n=-1,char middle=' '){ if(vec_n==-1)vec_n=vec_s.size(); for(int i=0;i uft_q1; vector uft_parent; vector uft_num; public: void init(){ uft_parent.assign(uft_n,-1); uft_num.assign(uft_n,0); } union_find_tree(int uft_num){ assert(uft_num>=0); uft_n=uft_num; init(); } union_find_tree(){ uft_n=uft_N; init(); } int check_parent(int uft_x){ assert(uft_x>=0 && uft_x=0 && uft_x=0 && uft_yuft_num[uft_y])swap(uft_x,uft_y); uft_parent[uft_x]=uft_y; uft_num[uft_y]+=uft_num[uft_x]; return false; } }; vector path[110000]; int outnum[110000]; queue q1; vector

v1; bool solve(){ int n,m; int i,j,k; int a,b,c; cin>>n>>m; union_find_tree uf(n); for(i=0;i>a>>b>>c; a--,b--; if(c==2){ v1.push_back(make_pair(a,b)); continue; } if(uf.connect(a,b))return true; } for(auto node:v1){ a=node.first,b=node.second; a=uf.check_parent(a),b=uf.check_parent(b); path[a].push_back(b); outnum[b]++; } int cnt=0; for(i=0;i