已经调了一天了
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5+10;
int n,m;
struct edge{
int to,cost;
};
struct ge{
int x,a,b;
};
vector<ge>E;
vector<int>g[maxn];
int dfn[maxn],low[maxn],col[maxn];
int cnt=0,clr=0;
bool vis[maxn];
stack<int>st;
int sz[maxn];
int in[maxn];
vector<edge>g1[maxn];
int dp[maxn];
int sum=0;
int ans=0;
void tarjan(int now){
dfn[now]=low[now]=++cnt;
vis[now]=1;
st.push(now);
for(int i=0;i<(int)g[now].size();i++){
int nxt=g[now][i];
if(!dfn[nxt]){
tarjan(nxt);
low[now]=min(low[now],low[nxt]);
}
else if(vis[nxt])low[now]=min(low[now],dfn[nxt]);
}
if(dfn[now]==low[now]){
int tmp=-1;
clr++;
while(tmp!=now){
tmp=st.top();
st.pop();
col[tmp]=clr;
vis[tmp]=0;
sz[clr]++;
}
}
}
void add(int u,int v,int w){
in[v]++;
g1[u].push_back((edge){v,w});
}
void build(){
for(int i=0;i<(int)E.size();i++){
ge now=E[i];
int ap=col[now.a];
int bp=col[now.b];
if(ap==bp){
if(now.x==2||now.x==4){
cout<<-1;
exit(0);
}
continue;
}
// cout<<ap<<' '<<bp<<' '<<(now.x+1)%2<<endl;
if(now.x==2)add(ap,bp,1);
if(now.x==3)add(ap,bp,0);
if(now.x==4)add(bp,ap,1);
if(now.x==5)add(bp,ap,0);
}
}
void topsort(){
queue<int>q;
for(int i=1;i<=clr;i++)if(in[i]==0)dp[i]=1,q.push(i);
// for(int i=1;i<=clr;i++)cout<<in[i]<<' ';
// cout<<endl;
while(!q.empty()){
int now=q.front();
q.pop();
sum++;
// cout<<sum<<endl;
for(int i=0;i<(int)g1[now].size();i++){
edge nxt=g1[now][i];
in[nxt.to]--;
dp[nxt.to]=max(dp[nxt.to],dp[now]+nxt.cost);
if(!in[nxt.to])q.push(nxt.to);
}
}
}
signed main(){
// freopen("data.in","r",stdin);
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++){
int x,a,b;
scanf("%lld%lld%lld",&x,&a,&b);
if(x==1)g[a].push_back(b),g[b].push_back(a);
if(x==3)g[a].push_back(b);
if(x==5)g[b].push_back(a);
E.push_back((ge){x,a,b});
}
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
build();
// return -1;
topsort();
if(sum<clr){
cout<<-1;
return 0;
}
// for(int i=1;i<=n;i++)cout<<col[i]<<' ';
// cout<<endl;
// for(int i=1;i<=clr;i++)cout<<dp[i]<<' ';
// cout<<endl;
for(int i=1;i<=clr;i++)ans+=dp[i]*sz[i];
cout<<ans;
return 0;
}
/*
萌新自己造的数据
3 2
2 1 2
5 2 3
3 3
1 1 2
2 2 3
4 1 3
*/