//给定有向路径,判断是否成环。另所有边为1,如果正反向边都有权重,则成环。
 #include<iostream>
#include<iostream>
 using namespace std;
using namespace std;
 #define INF 999999
#define INF 999999
 int D[101][101];
int D[101][101];
 bool floyd(int n)
bool floyd(int n)


 {
{
 int k,i,j;
  int k,i,j;
 for(k = 0; k < n; k++)
  for(k = 0; k < n; k++)
 for(i = 0; i < n; i++)
      for(i = 0; i < n; i++)
 for(j = 0; j < n; j++)
          for(j = 0; j < n; j++)

 
           {
{
 if(D[i][k]!=INF && D[k][j]!=INF)
             if(D[i][k]!=INF && D[k][j]!=INF)

 
              {
{
 if((D[i][k] + D[k][j]) < D[i][j])
                if((D[i][k] + D[k][j]) < D[i][j])
 D[i][j] = D[i][k] + D[k][j];
                    D[i][j] = D[i][k] + D[k][j];
 if(D[j][i] != INF && D[j][i]!= 0)
                if(D[j][i] != INF && D[j][i]!= 0)
 return false;
                    return false;

 }
             }
 }
          }
 return true;
  return true;
 }
}
 int main()
int main()


 {
{
 int n,m,i,j,a,b;
  int n,m,i,j,a,b;
 while(scanf("%d %d",&n,&m)!=EOF && n)
  while(scanf("%d %d",&n,&m)!=EOF && n)

 
   {
{
 for(i = 0; i < n; i++)
    for(i = 0; i < n; i++)

 
     {
{
 D[i][i] = 0;
       D[i][i] = 0;
 for(j = i+1;j < n;j++)
       for(j = i+1;j < n;j++)
 D[i][j] = D[j][i] = INF;
           D[i][j] = D[j][i] = INF;
 }
    }
 for(i = 0; i < m; i++)
    for(i = 0; i < m; i++)

 
     {
{
 scanf("%d %d",&a,&b);
       scanf("%d %d",&a,&b);
 D[a][b]=1;
       D[a][b]=1;
 }
    }
 if(floyd(n))
    if(floyd(n))
 puts("YES");
        puts("YES");
 else
    else
 puts("NO");
        puts("NO");
 }
  }
 }
}