#include <stdio.h>
#include <stdlib.h>

#define SIZE 1000000000

const int inf = 100000000;

enum status {
	EMPTY,
	AVAILABLE,
	FULL
};

typedef struct {
	int data[SIZE];
	int head;
	int tail;
	int flag;
}queue_t;

void initQueue(queue_t* pQueue) {
	for (int i = 0; i < SIZE; i++) {
		pQueue->data[i] = 0;
	}
	pQueue->head = 0;
	pQueue->tail = 0;
	pQueue->flag = EMPTY;
}

void enqueue(queue_t* pQueue, int value) {
	if (pQueue->flag == FULL) {
		return;
	}
	pQueue->data[pQueue->tail] = value;
	if (pQueue->tail == SIZE - 1) {
		pQueue->tail = 0;
	}
	else {
		pQueue->tail++;
	}
	if (pQueue->tail == pQueue->head) {
		pQueue->flag = FULL;
	}
	else {
		pQueue->flag = AVAILABLE;
	}
}

int dequeue(queue_t* pQueue) {
	if (pQueue->flag == EMPTY) {
		return 0;
	}
	int i = pQueue->data[pQueue->head];
	pQueue->data[pQueue->head] = 0;
	if (pQueue->head == SIZE - 1) {
		pQueue->head = 0;
	}
	else {
		pQueue->head++;
	}
	if (pQueue->tail == pQueue->head) {
		pQueue->flag = EMPTY;
	}
	else {
		pQueue->flag = AVAILABLE;
	}
	return i;
}



int main() {
	queue_t queue;
	queue_t* pQueue = &queue;
	initQueue(pQueue);

	int *d[200010], dd[200010] = { 0 }, t[200010] = { 0 }, a[200010] = { 0 }, b[200010] = { 0 }, tt[200010] = {0};
	int m, n;

	scanf("%d%d", &n, &m);
	for (int i = 0; i < m; i++) {
		scanf("%d%d", &a[i], &b[i]);
		t[a[i]-1]++;
		t[b[i]-1]++;
	}
	//for (int i = 0; i < m; i++)printf("%d %d %d lk\n", a[i],b[i],t[i]);
	
	for (int i = 0; i < n; i++) {
		d[i] = (int*)malloc(sizeof(int) * t[i]);
		if (d[i] == NULL) {
			return -1;
		}
	}

	for (int i = 0; i < m; i++) {
		d[a[i]-1][tt[a[i]-1]] = b[i];
		//printf("%dmk ", d[a[i]][tt[a[i]]]);
		tt[a[i]-1]++;
		d[b[i]-1][tt[b[i]-1]] = a[i];
		//printf("%dmk ", d[b[i]][tt[b[i]]]);
		tt[b[i]-1]++;
	}
	/*for (int i = 0; i < n; i++) {
		printf("\n");
		for (int j = 0; j < tt[i]; j++)printf("%d ", d[i][j]);
		printf("ok");
	}
	printf("\n");*/

	for (int i = 0; i <= n; i++) dd[i] = inf;

	for (int i = 0; i < t[0]; i++) {
		enqueue(pQueue, d[0][i]);
		dd[d[0][i]] = 1;
	}
	dd[1] = 0;

	while (pQueue->flag != EMPTY) {
		int p = dequeue(pQueue);
		//printf("\n%din ", p);
		for (int i = 0; i < t[p-1]; i++) {
			int n = d[p-1][i];
			//printf(" %dok ", n);
			if (dd[n] == inf) {
				for (int i = 0; i < t[n-1]; i++) {
					//printf("%den\?", d[n-1][i]);
					if (dd[d[n-1][i]] == inf) {
						enqueue(pQueue, d[n-1][i]);
						//printf("%den", d[n-1][i]);
					}
				}
				dd[n] = p;
				//printf("\nduy%d %duyr\n", n,dd[n]);
			}
		}
	}

	for (int i = 0; i < n; i++)if (dd[n] == inf) {
		printf("No");
		return 0;
	}
	printf("Yes\n");
	for (int i = 2; i <= n; i++)printf("%d\n", dd[i]);
	for (int i = 0; i < n; i++) free(d[i]);
	return 0;
}