#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,mod=998244353;
int n,m,a[N],b[N],c[N];
ll dp[N][2];
void cal(int);
ll t=0;
bool flag=true;
unordered_map<int,int>vis[N];
int low=3,vv[N][10];
int get(int x,int y)
{
    return vv[x][x-y+low];
}
void ins(int x,int y,int z)
{
    vv[x][x-y+low]=z;
}
ll qpow(ll a,ll n)
{
    ll ans=1;
    while(n)
    {
        if(n&1) ans=ans*a%mod;
        a=a*a%mod;
        n>>=1;
    }
    return ans;
}
void Dp()
{
    if(!vis[1][1]) dp[1][0]=dp[1][1]=1;
    else dp[1][vis[1][1]-1]=1;
    for(int i=2;i<=n;i++)
    {
        for(int j=0;j<2;j++)
            for(int k=0;k<2;k++)
                if(dp[i-1][k])
        {
            int v=(j^k);
            if(get(i-1,i)&&get(i,i-1))
            {
                int s=get(i-1,i)-1^get(i,i-1)-1;
                if(s^v) continue;
            }
            if(i!=n&&get(i+1,i-1)&&get(i-1,i+1))
            {
                int s=get(i-1,i+1)-1^get(i+1,i-1)-1;
                if(s^j) continue;
            }
            if(get(i,i)&&get(i,i)-1!=j) continue;
            int t1=2,t2=2;
            if(get(i-1,i)||get(i,i-1)) t1--;
            if(get(i+1,i-1)||get(i-1,i+1)||i==n) t2--;
            (dp[i][j]+=dp[i-1][k]*t1*t2)%=mod;
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a[i],&b[i],&c[i]);
        c[i]++;
        vis[a[i]][b[i]]=c[i];
        if(abs(a[i]-b[i])<=2) ins(a[i],b[i],c[i]);
    }
    Dp();
    if(n>3)
        t=((ll)n*n-n-(n-1)*2-(n-2)*2)/2;
    for(int i=1;i<=m;i++)
    {
        if(abs(a[i]-b[i])<=2) continue;
        if(vis[a[i]][b[i]]&&vis[b[i]][a[i]])
        {
            if(a[i]>b[i]) t--;
            if(vis[a[i]][b[i]]!=vis[b[i]][a[i]]) flag=false;
        }
        else t--;
    }
    if(!flag){printf("0\n");return 0;}
    printf("%lld\n",qpow(2,t)*(dp[n][0]+dp[n][1])%mod);
}
