#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
int readint(){
	int x=0,f=1;char s=getchar();
	#define sc (s=getchar())
	while(s<'0'||s>'9'){
		if(s=='-')
			f=-1;
		sc;
	}
	while(s>='0'&&s<='9'){
		x=(x<<3)+(x<<1)+(s^48);
		sc;
	}
	#undef sc
	return x*f;
}
struct zz{
	int u,v,w;
}s[maxn];
struct edge{
	int v,w,nxt;
	edge(){};
	edge(int V,int W,int N){
		v=V;
		w=W;
		nxt=N;
	}
}e[maxn<<1];
int head[maxn],edge_cnt=-1;
void addedge(int u,int v,int w){
	e[++edge_cnt]=edge(v,w,head[u]);
	head[u]=edge_cnt;
	e[++edge_cnt]=edge(u,w,head[v]);
	head[v]=edge_cnt;
}
int fa[maxn];
int findset(int x){
	if(fa[x]!=x)
		fa[x]=findset(fa[x]);
	return fa[x];
}
int ans[maxn];
void dfs(int u,int pre){
	for(int i=head[u];~i;i=e[i].nxt){
		int v=e[i].v;
		if(v==pre)
			continue;
		if(ans[u]==e[i].w)
			ans[v]=(e[i].w-1>0?e[i].w-1:e[i].w+1);
		else
			ans[v]=e[i].w;
		dfs(v,u);
	}
}
bool cmp(const zz &x,const zz &y){
	return x.w<y.w;
}
int main (){
	memset(head,-1,sizeof(head));
	int n=readint(),m=readint();
	for(int i=1;i<=m;i++){
		s[i].u=readint(),s[i].v=readint(),s[i].w=readint();
	}
	for(int i=1;i<=n;i++){
		fa[i]=i;
	}
	int cnt=0;
	for(int i=1;i<=m;i++){
		int u=s[i].u,v=s[i].v;
		int fu=findset(u),fv=findset(v);
		if(fu==fv)
			continue;
		addedge(u,v,s[i].w);
		fa[fu]=fv;
		cnt++;
		if(cnt==n-1)
			break;
	}
	int sum=0;
	for(int i=1;i<=n;i++){
		if(fa[i]==i)
			sum++;
	}
	if(sum!=1)
		return !printf("No");
	ans[1]=1;
	dfs(1,0);
	for(int i=1;i<=n;i++){
		printf("%d\n",ans[i]);
	}
	return 0;
} 
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int N, M;
int X[101], Y[101], Z[101];
int cnt[101];
ll memo[2 << 19];

ll dfs(int bit, int nbit){
    if(bit == (1 << N) - 1){
        return 1;
    }
    if(memo[bit] != -1) return memo[bit];
    ll ret = 0;
    for(int i=0;i<N;i++){
        if ((bit>>i)&1) continue;
        for(int j=0;j<M;j++){
            if(nbit + 1 <= X[j] && (i + 1) <= Y[j]){
                cnt[j]++;
            }
        }
        bool ok = true;
        for(int j=0;j<M;j++){
            if(cnt[j] > Z[j]){
                ok = false;
                break;
            }
        }
        if(ok){
            ret += dfs(bit | (1 << i), nbit + 1);
        }
        for(int j=0;j<M;j++){
            if(nbit + 1 <= X[j] && (i + 1) <= Y[j]){
                cnt[j]--;
            }
        }
    }
    memo[bit] = ret;
    return ret;
}

int main(){
    cin >> N >> M;

    for(int i=0;i<M;i++){
        cin >> X[i] >> Y[i] >> Z[i];
    }

    memset(cnt, 0, sizeof(cnt));
    memset(memo, -1, sizeof(memo));
    cout << dfs(0, 0) << endl;

    return 0;
}