WA on #7, 8, 9
#include<bits/stdc++.h>
#define ll long long
#define rll register ll
#define F(i,a,b) for(rll i=a;i<=b;i++)
#define Fdn(i,a,b) for(rll i=a;i>=b;i--)
#define int ll
using namespace std;
const int inf = 0x3f3f3f3f,mod = 1e9 + 7;
const int maxn = 1e5 + 7;
int n, m;
vector<pair<int, int>> G[maxn], _G[maxn];
int dfn[maxn], low[maxn], col[maxn], InStack[maxn], stk[maxn], DfnClock, SccCnt, TopStack, Siz[maxn], Candy[maxn], InDegree[maxn];
inline void Tarjan(int u) {
dfn[u] = low[u] = ++DfnClock,
stk[++TopStack] = u, InStack[u] = 1;
for(auto tmp : G[u]) {
int v = tmp.first;
if(!dfn[v]) {
Tarjan(v);
low[u] = min(low[u], low[v]);
} else if(InStack[v])
low[u] = min(low[u], dfn[v]);
}
if(dfn[u] == low[u]) {
SccCnt++;
while(stk[TopStack] != u)
col[stk[TopStack]] = SccCnt, InStack[stk[TopStack--]] = 0, Siz[SccCnt]++;
col[u] = SccCnt, InStack[u] = 0, Siz[SccCnt]++, TopStack--;
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m;
F(i, 1, m) {
int op, u, v; cin >> op >> u >> v;
if(op == 1) G[u].push_back({v, 0}), G[v].push_back({u, 0});
else if (op == 2) G[u].push_back({v, 1});
else if(op == 3) G[v].push_back({u, 0});
else if(op == 4) G[v].push_back({u, 1});
else G[u].push_back({u, 0});
}
F(i, 1, n) G[0].push_back({i, 1});
F(i, 0, n) if(!dfn[i]) Tarjan(i);
F(u, 0, n) {
for(auto tmp : G[u]) {
int v = tmp.first, w = tmp.second;
if(col[u] == col[v] && w == 1) {
cout << -1;
exit(0);
}
if(col[u] != col[v]) {
_G[col[u]].push_back({col[v], w});
InDegree[col[v]] ++;
}
}
}
queue<int> Q;
F(i, 1, SccCnt) {
if(!InDegree[i]) Q.push(i);
}
while(!Q.empty()) {
int u = Q.front(); Q.pop();
for(auto tmp : _G[u]) {
int v = tmp.first, w = tmp.second;
Candy[v] = max(Candy[v], Candy[u] + w);
if(!(--InDegree[v])) Q.push(v);
}
}
int ans = 0;
F(i, 1, SccCnt) ans += Candy[i] * Siz[i];
cout << ans;
return 0;
}