WA #6 #32 ,求救!
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
int n,k;
const int N=1e5+10;
struct edge{int v,w;};
vector<edge> g[N];
int bel[N],dfn[N],low[N],ins[N];
int stk[N<<1],tot=0,st=0,clr=0;;
void tarjan(int x){
dfn[x]=low[x]=++tot;
stk[++st]=x;ins[x]=1;
for(auto i:g[x]){
if(!dfn[i.v]){
tarjan(i.v);
low[x]=min(low[x],low[i.v]);
}else if(ins[i.v]){
low[x]=min(low[x],dfn[i.v]);
}
}
if(dfn[x]==low[x]){
clr++;
while(stk[st]!=x){
bel[stk[st]]=clr;ins[stk[st]]=0;st--;
}bel[stk[st]]=clr;ins[stk[st]]=0;st--;
}
}
queue<int> Q;
int dis[N],vis[N],rd[N];
vector<edge> G[N];
signed main(){
cin>>n>>k;
rep(i,1,k){
int x,a,b;cin>>x>>a>>b;
if(x==1)g[a].push_back({b,0}),g[b].push_back({a,0});
else if(x==2)g[a].push_back({b,1});
else if(x==3)g[b].push_back({a,0});
else if(x==4)g[b].push_back({a,1});
else g[a].push_back({b,0});
}
rep(i,1,n)if(!dfn[i])tarjan(i);
rep(i,1,n){
for(auto j:g[i]){
if(bel[i]==bel[j.v]){
if(j.w==1)puts("-1"),exit(0);
}else{
G[bel[i]].push_back({bel[j.v],j.w});
rd[bel[j.v]]++;
}
}
}
rep(i,1,clr)G[n+1].push_back({i,0}),rd[i]++;
Q.push(n+1);dis[n+1]=1;
while(!Q.empty()){
int t=Q.front();Q.pop();vis[t]=1;
for(auto i:G[t]){
if(!vis[i.v]){
dis[i.v]=max(dis[i.v],dis[t]+i.w);
rd[i.v]--;
if(!rd[i.v])Q.push(i.v);
}
}
}
rep(i,1,clr){
if(rd[i])puts("-1"),exit(0);
}int ans=0;
rep(i,1,n){
ans+=dis[bel[i]];
}cout<<ans;
}