import java.io.*;
import java.util.*;

public class Main {
   public static void main(String[] args) throws IOException {
        // 使用 BufferedReader 和 PrintWriter 提升大规模数据下的 I/O 效率
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

        // 读取输入的第一行,包含两个整数n和m,分别表示顶点数和边数
        String[] strA = br.readLine().trim().split("\\s+");
        int n = Integer.parseInt(strA[0]);  // 顶点数
        int m = Integer.parseInt(strA[1]);  // 边数

        // 创建邻接表表示的无向图
        List<Integer>[] adj = new ArrayList[n + 1];
        for (int i = 1; i <= n; i++) {
            adj[i] = new ArrayList<>();
        }

        // 读取所有边的信息,构建无向图
        for (int i = 0; i < m; i++) {
            String[] edge = br.readLine().trim().split("\\s+");
            int u = Integer.parseInt(edge[0]);  // 边的一个端点
            int v = Integer.parseInt(edge[1]);  // 边的另一个端点
            adj[u].add(v);  // 添加边到邻接表
            adj[v].add(u);  // 无向图,双向添加
        }

        // color数组用于记录每个顶点的颜色,0表示未染色,1和2表示两种不同的颜色
        int[] color = new int[n + 1];
        boolean flag = true;  // 标记是否为二分图

        // 使用队列实现BFS
        Queue<Integer> queue = new LinkedList<>();

        // 从顶点1开始染色,并将其加入队列
        queue.add(1);
        color[1] = 1;

        // BFS遍历图
        while (!queue.isEmpty()) {

            int cur = queue.poll();  // 取出队首顶点

            // 遍历当前顶点的所有邻接顶点
            for (int neighbor : adj[cur]) {

                // 如果邻接顶点未被染色
                if (color[neighbor] == 0) {

                    // 将邻接顶点染成与当前顶点不同的颜色
                    color[neighbor] = 3 - color[cur];
                    queue.add(neighbor);  // 将邻接顶点加入队列
                } else if (color[neighbor] == color[cur]) {
                    // 如果邻接顶点与当前顶点颜色相同,则不是二分图
                    flag = false;
                    break;
                }
            }
        }

        // 输出结果:如果是二分图输出"YES",否则输出"NO"
        out.println(flag ? "YES" : "NO");
        // 刷新输出缓冲区,确保所有输出都被写入
        out.flush();
        // 关闭输出流
        out.close();
        // 关闭输入流
        br.close();
    }
}