#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;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBpbnQgbG9uZyBsb25nIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBsb25nIGxvbmcgb289MWUxODsKY29uc3QgaW50IG1vZD05OTgyNDQzNTM7CmNvbnN0IGludCBiYXNlPTMxOwpjb25zdCBpbnQgQj0zMjA7CmludCBUZXN0PTE7CnZvaWQgaG9tZSgpCnsKICAgIGlmKGZvcGVuKCJtYWluLmlucCIsInIiKSkgCiAgICBmcmVvcGVuKCJtYWluLmlucCIsInIiLHN0ZGluKSwKICAgIGZyZW9wZW4oIm1haW4ub3V0IiwidyIsc3Rkb3V0KTsKfQpib29sIGJpdChpbnQgbWFzayxpbnQgaSl7cmV0dXJuIChtYXNrPj5pKSYxO30Kc3RydWN0IEVkZ2UKewogICAgaW50IHUsdix3OwogICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRWRnZSAmb3QpY29uc3R7CiAgICAgICAgcmV0dXJuIHc8b3QudzsKICAgIH0KfWVbMjAwMDA1XTsKc3RydWN0IFJvbGx7aW50IHUsc2l6LHc7fTt2ZWN0b3I8Um9sbD5yOwppbnQgbixtOwppbnQgYm9bMzAwMDA1XSxzelszMDAwMDVdLGFucz0xOwppbnQgVGltKGludCBhKQp7CiAgICBpZihhPT1ib1thXSlyZXR1cm4gYTsKICAgIHJldHVybiBUaW0oYm9bYV0pOwp9CmludCBIb3AoaW50IHUsaW50IHYsaW50IHcpCnsKICAgIHU9VGltKHUpLHY9VGltKHYpOwogICAgaWYodT09dilyZXR1cm4gZmFsc2U7CiAgICBpZihzelt1XTxzelt2XSlzd2FwKHUsdik7CiAgICByLnB1c2hfYmFjayh7dSxzelt1XSx3fSk7CiAgICByLnB1c2hfYmFjayh7dixzelt2XSx3fSk7CiAgICBib1t2XT11O3N6W3VdKz1zelt2XTsKICAgIHJldHVybiB0cnVlOwp9CnZvaWQgUm9sbEJhY2soaW50IHcpCnsKICAgIHdoaWxlKHIuc2l6ZSgpJiZyLmJhY2soKS53PT13KQogICAgewogICAgICAgIGF1dG8gW3Usc2l6LHddPXIuYmFjaygpO3IucG9wX2JhY2soKTsKICAgICAgICBib1t1XT11LHN6W3VdPXNpejsKICAgIH0KfQppbnQgV2F5cyh2ZWN0b3I8RWRnZT4mZSkKewogICAgaW50IHM9ZS5zaXplKCkscmVzPTAsY250PTA7CiAgICBmb3IoaW50IGk9MDtpPGUuc2l6ZSgpO2krKylpZihIb3AoZVtpXS51LGVbaV0udixlW2ldLncpKWNudCsrOwogICAgZm9yKGludCBtYXNrPTA7bWFzazwoMTw8cyk7bWFzaysrKQogICAgewogICAgICAgIGludCBvaz0xLHVzZWQ9MDsKICAgICAgICBmb3IoaW50IGk9MDtpPGUuc2l6ZSgpO2krKykKICAgICAgICB7CiAgICAgICAgICAgIGlmKGJpdChtYXNrLGkpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB1c2VkKys7CiAgICAgICAgICAgICAgICBpZighSG9wKGVbaV0udSxlW2ldLnYsZVtpXS53KSlvaz0wOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFJvbGxCYWNrKGVbMF0udyk7CiAgICAgICAgaWYob2smJmNudD09dXNlZClyZXMrKzsKICAgIH0KICAgIGZvcihpbnQgaT0wO2k8ZS5zaXplKCk7aSsrKUhvcChlW2ldLnUsZVtpXS52LGVbaV0udyk7CiAgICByZXR1cm4gcmVzOwp9CmludCBDaGVjaygpCnsKICAgIGZvcihpbnQgaT0xO2k8PW47aSsrKWlmKFRpbSgxKSE9VGltKGkpKXJldHVybiAwOwogICAgcmV0dXJuIDE7Cn0Kdm9pZCBUY21kdWNfVk9JMjcoKQp7CiAgICBjaW4+Pm4+Pm07CiAgICBmb3IoaW50IGk9MTtpPD1uO2krKylib1tpXT1pLHN6W2ldPTE7CiAgICBmb3IoaW50IGk9MTtpPD1tO2krKykKICAgIHsKICAgICAgICBpbnQgdSx2LHc7Y2luPj51Pj52Pj53OwogICAgICAgIGVbaV09e3Usdix3fTsKICAgIH0KICAgIHNvcnQoZSsxLGUrbSsxKTsKICAgIGZvcihpbnQgaT0xO2k8PW07KQogICAgewogICAgICAgIGludCBqPWk7dmVjdG9yPEVkZ2U+Y3VyOwogICAgICAgIGZvcig7ajw9bTtqKyspCiAgICAgICAgewogICAgICAgICAgICBpZihlW2ldLnchPWVbal0udylicmVhazsKICAgICAgICAgICAgY3VyLnB1c2hfYmFjayhlW2pdKTsKICAgICAgICB9CiAgICAgICAgYW5zPShhbnMqV2F5cyhjdXIpKSVtb2Q7CiAgICAgICAgaT1qOwogICAgfQogICAgaWYoIUNoZWNrKCkpY291dDw8MDsKICAgIGVsc2UgY291dDw8YW5zOwp9CnNpZ25lZCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTtjaW4udGllKDApO2NvdXQudGllKDApO2hvbWUoKTsKICAgIHdoaWxlKFRlc3QtLSlUY21kdWNfVk9JMjcoKTsKICAgIHJldHVybiAwOwp9