tarjan:
#include <iostream>
#include <cstring>
#include <stack>
#define Me 100002
#define Mn 10010
#define clr(x, k) memset((x),(k),sizeof(x))
using namespace std;
struct Edges
{
int to, next;
//int w;
}edg[Me]; // director graph
int n, m, d, ct;
int head[Mn], dfn[Mn], low[Mn], belong[Mn];
bool instack[Mn];
stack <int> s;
void add_e(int i, int u, int v)
{
edg[i].to = v;
edg[i].next = head[u];
head[u] = i;
}
int mm(int a, int b)
{
if (a>b) return b;
return a;
}
void tarjan(int i)
{
int j;
dfn[i] = low [i] = ++d;
s.push(i);
instack[i] = true;
for (int u=head[i];u!=-1;u=edg[u].next)
{
j = edg[u].to;
if (dfn[j]==0)
{
tarjan(j);
if (low[i]>low[j])
low[i] = low[j];
}
else
if (instack[j] && dfn[j]<low[i])
low[i] = dfn[j];
}
if (dfn[i]==low[i])
{
ct++;
do
{
j = s.top();
s.pop();
instack[j] = false;
belong[j] = ct;
// printf("%d ", j);
}while (j!=i);
// printf("\n");
}
}
int main()
{
while (~scanf("%d %d", &n, &m) && m||n)
{
clr(head, -1);
clr(instack, 0);
clr(dfn, 0);
int u, v;
for (int i=0;i<m;i++)
{
scanf("%d %d", &u, &v);
add_e(i, u, v);
}
d = 0;
ct = 0;
for (int i=1;i<=n;i++) // start with 1;
{
if (!dfn[i])
tarjan(i);
if (ct>1) break;
}
if (ct==1) printf("Yes");
else printf("No");
printf("\n");
}
return 0;
}