#include<bits/stdc++.h>
using namespace std;
 
#define MOD 998244353
template<typename ty1,typename ty2>
inline int add(ty1 x, ty2 y) {
	if(y>=MOD)y%=MOD;
	if(x>=MOD)x%=MOD;
    x += y; return x < MOD ? x : x - MOD;
}
template<typename ty1,typename ty2>
inline void addto(ty1 &x, ty2 y) {
		  if(y>=MOD)y%=MOD;
		  if(x>=MOD)x%=MOD;
	      x += y; if (x >= MOD) x -= MOD;
}
template<typename ty1,typename ty2>
inline int sub(ty1 x, ty2 y) {
		if(y>=MOD)y%=MOD;
		 if(x>=MOD)x%=MOD;
        x -= y; return x < 0 ? x + MOD : x;
}
template<typename ty1,typename ty2>
inline void subto(ty1 &x, ty2 y) {
	if(y>=MOD)y%=MOD;
	if(x>=MOD)x%=MOD;
    x -= y; if (x < 0) x += MOD;
}
template<typename ty1,typename ty2>
inline int mul(ty1 x, ty2 y) {
        if(y>=MOD)y%=MOD;
		if(x>=MOD)x%=MOD;
        return 1ll * x * y % MOD;
}
template<typename ty1,typename ty2>
void multo(ty1 &x, ty2 y) {
        if(y>=MOD)y%=MOD;
		if(x>=MOD)x%=MOD;
        x=1ll * x * y % MOD;
}
  
long long int gcd(long long int a, long long int b){
	if (a > b){
		swap(a, b);
	}
	while (a){
		swap(a, b);
		a %= b;
	}
	return b;
}
long long int lcm(long long int a, long long int b){
	return a / gcd(a, b)*b;
}
long long int ppow(long long int i, long long int j){
		long long int res = 1LL;
		while (j){
			if ((j & 1LL)){
				res *= i;
				if (res >= MOD){
					res %= MOD;
				}
			}
			j >>= 1;
			i *= i;
			if (i >= MOD){
				i %= MOD;
			}
		}
		return res;
	}
class Combination{
	
public:
	vector<long long int> k;
	vector<long long int> r;
	void resize(int N){
		k.resize(N + 2);
		r.resize(N + 2);
		k[0] = 1;
		for (int i = 1; i < N+2; i++){
			k[i] = k[i - 1];
			k[i] *= i;
			if (k[i] >= MOD)k[i] %= MOD;
		}
		long long int al = k[k.size() - 1];
		long long int iv = ppow(k[k.size() - 1],MOD-2);
		r[k.size() - 1] = iv;
		for (int i = (int)(r.size()) - 2; i >= 0; i--){
			r[i] = r[i + 1] * (i + 1);
			if (r[i] >= MOD){
				r[i] %= MOD;
			}
		}
	}
	long long int C(int a, int b){
		if (a < b)return 0;
		long long int up = k[a];
		long long int dw = r[b] * r[a - b];
		dw %= MOD;
		up *= dw;
		up %= MOD;
		return up;
	}
	long long int H(int a, int b){
		return C(a + b - 1, b);
	}
	long long int catalan_number(int n){
		return (C(2 * n, n) + MOD - C(2 * n, n - 1)) % MOD;
	}
};
Combination C;
#define MAX 100002
int n;
int m;
vector<pair<int,int> > v;
int dp[MAX][1<<4];
 
int tmp[4][4];
int designate[4][4];
unordered_map<long long int,int> uf;
inline bool validate(int coordinate,int len){
	for(int x=0;x<len;x++){
		for(int y=0;y<len;y++){
			if(designate[x][y]!=-1&&tmp[x][y]!=designate[x][y]){
				return false;
			}
		}
	}
	for(int x=0;x<len;x++){
		for(int y=x+1;y<len;y++){
			int flag=0;
			for(int i=x;i<=y;i++){
				for(int j=x;j<=y;j++){
					flag^=tmp[i][j];
				}
			}
			if(flag)return false;
		}
	}
	return true;
}
void unfold(int val){
	for(int i=0;i<2;i++){
		for(int j=0;j<2;j++){
			tmp[i][j]=(val&1);
			val>>=1;
		}
	}
}
void unfold2(int val){
	for(int i=0;i<3;i++){
		tmp[2][i]=(val&1);
		val>>=1;
	}
	tmp[0][2]=(val&1);
	val>>=1;
	tmp[1][2]=(val&1);
}
int encode(int x,int y){
	int ret=0;
	for(int i=x+1;i>=x;i--){
		for(int j=y+1;j>=y;j--){
			ret+=tmp[i][j];
			ret<<=1;
		}
	}
	return ret/2;
}
int main(){
	cin>>n>>m;
	long long int er=0;
	for(int i=0;i<m;i++){
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		a--;
		b--;
		if(abs(a-b)<=2){
			uf[(long long int)a*100000LL+b]=c;
		}
		else{
			if(uf.count(b*100000LL+a)){
				if(uf[b*100000LL+a]!=c){
					puts("0");
					return 0;
				}
			}
			else{
				er++;
				uf[a*100000LL+b]=c;
			}
		}
	}
	long long int overall=0;
	for(int i=0;i<n;i++){
		int lef=i-2;
		int rig=i+2;
		lef=max(0,lef);
		rig=min(rig,n-1);
		overall+=rig-lef+1;
	}
	overall=((long long int)n*n-overall);
	overall-=er*2;
	overall/=2LL;
	overall=ppow(2,overall);
	overall%=MOD;
	auto ud=[&](int coordinate,int len){
		for(int x=0;x<len;x++){
			for(int y=0;y<len;y++){
				int i=x+coordinate;
				int j=y+coordinate;
				if(uf.count(100000LL*i+j)){
					designate[x][y]=uf[100000LL*i+j];
				}
				else{
					designate[x][y]=-1;
				}
			}
		}
	};
	ud(0,2);
	for(int i=0;i<(1<<4);i++){
		unfold(i);
		if(validate(0,2)){
			dp[0][i]=1;
		}
	}
	int ans=0;
	for(int i=0;i<n-2;i++){
		ud(i,3);
		for(int j=0;j<(1<<4);j++){
			if(dp[i][j]==0)continue;
			unfold(j);
			for(int k=0;k<(1<<5);k++){
				unfold2(k);
				if(validate(i,3)){
					int state=encode(1,1);
					addto(dp[i+1][state],dp[i][j]);
				}
			}
		}
	}
	for(int j=0;j<(1<<4);j++){
		addto(ans,dp[n-2][j]);
	}
	printf("%d\n",mul(overall,ans));
	return 0;
}


Measured memory_bytes: 8588