// Slower C++ solution:
#include <iostream>

#include <cstdio>

#include <cstring>

#include <algorithm>

#include <queue>

#include <vector>

#include <cmath>

#define LL long long

using namespace std;

const int MOD=1e9+7;

const int INF=0x3f3f3f3f;

const int M=200100;

const int N=100100;

inline void read(int &x){

	x=0;int mm=1; char ch=getchar();

	while((ch>'9'||ch<'0')&&ch!='-') ch=getchar();

	if(ch=='-') mm=-1,ch=getchar();

	while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();

	x=x*mm;

}

inline void read(LL &x){

	x=0;LL mm=1; char ch=getchar();

	while((ch>'9'||ch<'0')&&ch!='-') ch=getchar();

	if(ch=='-') mm=-1,ch=getchar();

	while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();

	x=x*mm;

}

struct Edge{

	int nxt;

	int v,w;

}edge[M<<2];

int head[N],tot;

void add(int u,int v,int w){

	edge[++tot].nxt=head[u];

	edge[tot].v=v;

	edge[tot].w=w;

	head[u]=tot;

}

int n,m;

int dist[N];

bool visited[N],inque[N];

queue <int> q;

bool SPFA(int beginn){

	visited[beginn]=true;

	inque[beginn]=true;

	dist[beginn]=0;

	q.push(beginn);

	int maxx=0,minn=0;

	while(!q.empty()){

		int u=q.front();q.pop();

		inque[u]=false;

		for(int i=head[u];i;i=edge[i].nxt){

			Edge &e=edge[i];

			if(dist[e.v]<INF){

				if(dist[e.v]!=e.w+dist[u]){

					return false;

				}

			}else{

				dist[e.v]=e.w+dist[u];

				maxx=max(maxx,dist[e.v]);

				minn=min(minn,dist[e.v]);

				if(maxx-minn>INF) return false;

				visited[e.v]=true;

				if(!inque[e.v]){

					inque[e.v]=true;

					q.push(e.v);

				}

			}

		}

	}

	return true;

}

int main(){

	read(n),read(m);

	memset(head,0,sizeof(head));

	for(int i=1;i<=m;i++){

		int u,v,w;

		read(u),read(v),read(w);

		add(u,v,w);

		add(v,u,-w);

	}

	memset(dist,INF,sizeof(dist));

	for(int i=1;i<=n;i++){

		if(!visited[i])

			if(!SPFA(i)){

				printf("No");

				return 0;

			}

	}

	printf("Yes");

	return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.289460750494042x):
#include <bits/stdc++.h>

using namespace std;

const int N=1e5+5,M=2e5+5;

int n,m;



inline int in(){

	int x=0;char ch=getchar();

	while(ch>'9'||ch<'0') ch=getchar();

	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();

	return x;

}



int cnt,head[N],to[2*M],wi[2*M],nxt[2*M];

inline void adds(int x,int y,int z){

	to[++cnt]=y,wi[cnt]=z,nxt[cnt]=head[x],head[x]=cnt;

	return ;

}



inline void solve_in(){

	int a,b,c;

	n=in(),m=in();

	for(int i=1;i<=m;i++){

		a=in(),b=in(),c=in();

		adds(a,b,c),adds(b,a,-c);

	}

	return ;

}



bool co[N];

int dis[N];

bool vis[N];

queue< int > Q;

inline bool SPFA(int st){

	int mis=0,mas=0;

	dis[st]=0,vis[st]=true,Q.push(st);

	while(!Q.empty()){

		int u=Q.front();Q.pop();

		vis[u]=false,co[u]=true;

		for(int i=head[u];i;i=nxt[i]){

			int v=to[i],w=wi[i];

			co[v]=true;

			if(dis[v]==0x3f3f3f3f){

				dis[v]=dis[u]+w;

				mas=max(mas,dis[v]);

				mis=min(mis,dis[v]);

				if(mas-mis>1e9) return false;

				if(!vis[v]) vis[v]=true,Q.push(v);

			}

			else if(dis[v]!=dis[u]+w) return false;

		}

	}

	return true;

}



int main(){

	solve_in();

	memset(dis,0x3f,sizeof(dis));

	for(int i=1;i<=n;i++){

		if(!co[i]){

			if(!SPFA(i)){

				puts("No");

				return 0;

			}

		}

	}

	puts("Yes");

	return 0;

}