真的无语了,对拍时 hack 了一堆路人,自己代码过不去
#include<bits/stdc++.h>
#define int long long
#define ll long long
using namespace std;
const ll N=4e5+5,mod=998244353;
ll n,m,res=1,X[N],Y[N],Z[N],maxx[N],w[N],px,py,cnt[N],tot;
struct edge{int fr,to;};vector<edge>b[N];
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) maxx[i]=n;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&X[i],&Y[i],&Z[i]);
b[Z[i]].push_back(edge{X[i],Y[i]});
maxx[X[i]]=min(maxx[X[i]],Z[i]);
maxx[Y[i]]=min(maxx[Y[i]],Z[i]);
}
for(int i=1;i<=m;i++){
if(maxx[X[i]]>=Z[i]) continue;
if(maxx[Y[i]]>=Z[i]) continue;
puts("0");
return 0;
}
for(int i=1;i<=n;i++) cnt[maxx[i]]++;
for(int i=n,l;i>=1;i--){
l=b[i].size();tot+=cnt[i];
if(l>=2){
px=b[i][0].fr,py=b[i][0].to;
for(int j=1;j<l;j++){
if((px!=b[i][j].fr)&&(px!=b[i][j].to)) px=0;
if((py!=b[i][j].fr)&&(py!=b[i][j].to)) py=0;
}
px=(px|py);
if(!px){puts("0");return 0;}
if(maxx[px]<i){puts("0");return 0;}
w[px]=i;
}
if(l==1){
px=b[i][0].fr,py=b[i][0].to;
if(maxx[px]<i) px=0;
if(maxx[py]<i) py=0;
if((!px)&&(!py)){puts("0");return 0;}
if(px&&py) res=res*2ll;
}
if(!l) res=res*tot%mod;
tot--;
}
printf("%lld\n",(res%mod+mod)%mod);
return 0;
}