// AtCoder165 C

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <assert.h>
#include <string.h>
#include <memory.h>
#include <malloc.h>
#include <stdlib.h>
#include <ctype.h>

// qsortで用いる比較用関数．*a<*bならaが先になる．
int compare(const void* a, const void* b) {
    return *(int*)a - *(int*)b;
}

int revcompare(const void* a, const void* b) {
    return *(int*)b- *(int*)a;
}

double dmax(double x, double y){
    if(x < y) return y;
    return x;
}

int main() {
    int i,j;
    int n;
    
    int a,b;
    int m;

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

    int nexts[100000] = {0};
    int tmpnexts[100000] = {0};
    int nextcnt = 0;
    int iscomplete = 1;
    int* ans;
    ans = (int*)calloc(n,sizeof(int));
    for(i=0;i<n;i++){
        if(graph[0][i]==1){
            nexts[nextcnt] = i;
            nextcnt++;
            ans[i] = 1;
        }
    }
    nextcnt = 0;
    while(iscomplete){
        for(i=0;nexts[i] != 0; i++){
            for(j=0;j<n;j++){
                if(graph[nexts[i]][j] == 1){
                    if(ans[j] == 0) ans[j] = nexts[i]+1;
                    tmpnexts[nextcnt] = j;
                    nextcnt++;
                }
            }
        }

        iscomplete = 0;
        for(i=0;i<n;i++){
            if(ans[i] == 0){
                iscomplete = 1;
                break;
            }
        }
        
        for(i=0;i<sizeof nexts/ sizeof(nexts[0]);i++){
            nexts[i] = tmpnexts[i];
            tmpnexts[i] = 0;
        }
    }

    for(i=1;i<n;i++){
        printf("%d\n", ans[i]);
    }
    return 0;

}