#include <bits/stdc++.h>
#define fi first
#define se second
#define int long long 
using namespace std;
const long long oo=1e18;
const int mod=998244353;
const int base=31;
const int B=320;
int Test=1;
void home()
{
    if(fopen("main.inp","r")) 
    freopen("main.inp","r",stdin),
    freopen("main.out","w",stdout);
}
bool bit(int mask,int i){return (mask>>i)&1;}
struct Edge
{
    int u,v,w;
    bool operator<(const Edge &ot)const{
        return w<ot.w;
    }
}e[200005];
struct Roll{int u,siz,w;};vector<Roll>r;
int n,m;
int bo[300005],sz[300005],ans=1;
int Tim(int a)
{
    if(a==bo[a])return a;
    return Tim(bo[a]);
}
int Hop(int u,int v,int w)
{
    u=Tim(u),v=Tim(v);
    if(u==v)return false;
    if(sz[u]<sz[v])swap(u,v);
    r.push_back({u,sz[u],w});
    r.push_back({v,sz[v],w});
    bo[v]=u;sz[u]+=sz[v];
    return true;
}
void RollBack(int w)
{
    while(r.size()&&r.back().w==w)
    {
        auto [u,siz,w]=r.back();r.pop_back();
        bo[u]=u,sz[u]=siz;
    }
}
int Ways(vector<Edge>&e)
{
    int s=e.size(),res=0,cnt=0;
    for(int i=0;i<e.size();i++)if(Hop(e[i].u,e[i].v,e[i].w))cnt++;
    for(int mask=0;mask<(1<<s);mask++)
    {
        int ok=1,used=0;
        for(int i=0;i<e.size();i++)
        {
            if(bit(mask,i))
            {
                used++;
                if(!Hop(e[i].u,e[i].v,e[i].w))ok=0;
            }
        }
        RollBack(e[0].w);
        if(ok&&cnt==used)res++;
    }
    for(int i=0;i<e.size();i++)Hop(e[i].u,e[i].v,e[i].w);
    return res;
}
int Check()
{
    for(int i=1;i<=n;i++)if(Tim(1)!=Tim(i))return 0;
    return 1;
}
void Tcmduc_VOI27()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)bo[i]=i,sz[i]=1;
    for(int i=1;i<=m;i++)
    {
        int u,v,w;cin>>u>>v>>w;
        e[i]={u,v,w};
    }
    sort(e+1,e+m+1);
    for(int i=1;i<=m;)
    {
        int j=i;vector<Edge>cur;
        for(;j<=m;j++)
        {
            if(e[i].w!=e[j].w)break;
            cur.push_back(e[j]);
        }
        ans=(ans*Ways(cur))%mod;
        i=j;
    }
    if(!Check())cout<<0;
    else cout<<ans;
}
signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);home();
    while(Test--)Tcmduc_VOI27();
    return 0;
}