#include<bits/stdc++.h>
using namespace std;
int n,m,op,u,v,w,num,head[6000],dis[6000],pd[6000],t[6000];
queue<int>q;
struct edge{int next,to,cost;}g[20000];
void add(int a,int b,int c){g[++num]=(edge){head[a],b,c};head[a]=num;}
int main(){
cin>>n>>m;
while(m--){
scanf("%d%d%d",&op,&u,&v);
if(op==1) scanf("%d",&w),add(u,v,-w);
else if(op==2) scanf("%d",&w),add(v,u,w);
else add(u,v,0),add(v,u,0);
}
for(int i=1;i<=n;++i) add(0,i,0),dis[i]=INT_MAX;
q.push(0);
dis[0]=0;
pd[0]=1;
t[0]=1;
while(q.size()){
u=q.front();
q.pop();
pd[u]=0;
for(int i=head[u];i;i=g[i].next){
v=g[i].to,w=g[i].cost;
if(dis[v]>1ll*dis[u]+w){
dis[v]=dis[u]+w;
if(!pd[v]){
if(++t[v]>n+1) return puts("NO"),0;
pd[v]=1;
q.push(v);
}
}
}
}
return puts("Yes"),0;
}