#include \n#include \n#include \nusing namespace std;\n\nbool isValid(int N, int M, vector<pair<int, int>>& connections) {\n // 创建一个邻接表\n vector<set> adjList(N + 1);\n for (auto& conn : connections) {\n int u = conn.first;\n int v = conn.second;\n adjList[u].insert(v);\n adjList[v].insert(u);\n }\n \n // 遍历每个端点\n for (int i = 1; i <= N; i++) {\n set visited;\n visited.insert(i);\n vector currLevel;\n currLevel.push_back(i);\n \n // 广度优先搜索\n while (!currLevel.empty()) {\n vector nextLevel;\n for (int node : currLevel) {\n for (int neighbor : adjList[node]) {\n // 如果邻居节点已经访问过,则返回false\n if (visited.count(neighbor) > 0) return false;\n visited.insert(neighbor);\n nextLevel.push_back(neighbor);\n }\n }\n currLevel = nextLevel;\n }\n \n // 如果有未访问的节点,则返回false\n if (visited.size() != N) return false;\n }\n \n return true;\n}\n\nint main() {\n int N, M;\n while (cin >> N >> M) {\n if (N == 0 && M == 0) break;\n \n vector<pair<int, int>> connections(M);\n for (int i = 0; i < M; i++) {\n int A, B;\n cin >> A >> B;\n connections[i] = make_pair(A, B);\n }\n \n if (isValid(N, M, connections)) {\n cout << "Yes" << endl;\n } else {\n cout << "No" << endl;\n }\n }\n \n return 0;\n}