//染色法思路:从一个点开始染色,相邻点染不一样颜色
//原理:若是不存在奇数环,则染色过程当中不会出现染色冲突
//时间复杂度:n+m n个点向外遍历共m条边
//二分图:当且仅当图中不含奇数环
//奇数环:环中边的数目是奇数
//图中不含奇数环,则染色过程当中必定没有矛盾
import java.util.Arrays;
import java.util.Scanner;
public class Main{
static final int N=100005,M=2*N;
static int h[]=new int[N];
static int e[]=new int[M];
static int ne[]=new int[M];
static int n,m,idx;
static int color[]=new int[N];
static void add(int a,int b){
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
//染色法
static boolean dfs(int u,int c){
color[u]=c;
for(int i=h[u];i!=-1;i=ne[i]){//给点u的全部邻接点染色
int j=e[i];
if(color[j]==0){//若是没有没染过色,就染色
if(!dfs(j,3-c)) return false;
}
else if(color[j]==c) return false;//若是染过色而且和当前点u颜色相同,就不是二分图
}
return true;
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
n=scan.nextInt();
m=scan.nextInt();
Arrays.fill(h, -1);
while(m-->0){
int a=scan.nextInt();
int b=scan.nextInt();
add(a,b);
add(b,a);
}
boolean flag=true;
for(int i=1;i<=n;i++)//图可能不连通,因此每一个点都要遍历
if(color[i]==0){//当前点没染过色
if(!dfs(i,1)){
flag=false;
break;
}
}
if(flag) System.out.println("Yes");
else System.out.println("No");
}
}