#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 5010
#define maxm 10010
using namespace std;
int n,m,head[maxn],nxt[maxm],to[maxm],wgh[maxm],cnt[maxn],flag,dis[maxn],vis[maxn];
queue<int> q;
void add(int u,int v,int w){
nxt[++cnt[0]]=head[u];
to[cnt[0]]=v;
wgh[cnt[0]]=w;
head[u]=cnt[0];
}
int main(){
freopen("data.in","r",stdin);
freopen("mine.out","w",stdout);
memset(dis,0x3f,sizeof(dis));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int op,a,b,w;
scanf("%d",&op);
if(op==1){
scanf("%d%d%d",&a,&b,&w);
add(a,b,-w);
}
else if(op==2){
scanf("%d%d%d",&a,&b,&w);
add(b,a,w);
}
else{
scanf("%d%d",&a,&b);
add(a,b,0);
add(b,a,0);
}
}
for(int i=1;i<=n;i++)
add(n+1,i,0);
cnt[n+1]=0;
dis[n+1]=0;
q.push(n+1);
while(!q.empty()){
int f=q.front();
q.pop();
vis[f]=0;
cnt[f]++;
if(cnt[f]>=n+1){
flag=1;
break;
}
for(int i=head[f];i;i=nxt[i]){
int ti=to[i],wi=wgh[i];
if(dis[ti]>dis[f]+wi){
dis[ti]=dis[f]+wi;
if(!vis[ti]){
vis[ti]=1;
q.push(ti);
}
}
}
}
if(flag)
printf("No");
else
printf("Yes");
return 0;
}