//染色法思路:從一個點開始染色,相鄰點染不一樣顏色
//原理:若是不存在奇數環,則染色過程當中不會出現染色衝突
//時間複雜度: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");
}
}