A 并查集 B站讲解https://www.bilibili.com/video/BV1GT4y1M78d?p=1

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//typedef __int128 INT;
typedef double db;
typedef vector<int> vii;
typedef vector<ll> vll;
typedef pair<int,int> PII;
#define so sizeof
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define fi first
#define se second
#define mp make_pair
//#define lb lower_bound
#define ub upper_bound
const db esp=1e-5;
const int N=2e5+10,M=2e5+10,Max=500,inf=0x3f3f3f3f,mod=998244353;
const ll INF=0x3f3f3f3f3f3f3f3f;

int n,m;
int a,b,c;
int fth[N];
int ans,ecnt;

struct E{
    int a,b;
    E(int a=0,int b=0):a(a),b(b){};
};
E e[M];

int find(int x){
    return (fth[x]==x)?x:fth[x]=find(fth[x]);
}
void join(int a,int b){
    int fa=find(a), fb=find(b);
    if(fa!=fb){
        fth[fa]=fb;
    }
}
void work(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) fth[i]=i;
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&a,&b,&c);
        if(c==0){
            join(a,b);
        }else{
            e[ecnt++]=E(a,b);
        }
    }
    for(int i=0;i<ecnt;i++){
        int a=e[i].a, b=e[i].b;
        int fa=find(a), fb=find(b);
        if(fa!=fb){
            ans++; join(a,b);
        }
    }
    int flag=0;
    for(int i=1;i<=n;i++)
        if(fth[i]==i)
            flag++;
    if(flag>1) puts("-1");
    else{
        printf("%d\n",ans);
    }
    return ;
}


int main(){
        work();
    return 0;
}