#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <list>
#include <queue>
using namespace std;
#define FILE_IN_BFS "bfs.in"
#define FILE_OUT_BFS "bfs.out"
#define FILE_IN_DFS "dfs.in"
#define FILE_OUT_DFS "dfs.out"
#define ALB 0
#define GRI 1
#define NEGRU 2
void explore(int p[], int color[], vector<vector<int> > &graph, int &timp, int dist[], int u);
void dfs(vector<vector<int> > &graph, FILE * fout) {
int dist[graph.size()];
int color[graph.size()];
int p[graph.size()];
for (int i = 0; i < (int) graph.size() ; i++) {
p[i] = -1;
color[i] = ALB;
}
int timp = 0;
int nr_comp_conexe = 0;
for (int i = 1; i < (int) graph.size(); i++) {
if (color[i] == ALB) {
//printf("%d\n", i);
nr_comp_conexe++;
explore(p, color, graph, timp, dist, i);
}
}
//printf("%d\n", nr_comp_conexe);
fprintf(fout, "%d\n", nr_comp_conexe);
}
void explore(int p[], int color[], vector<vector<int> > &graph, int &timp, int dist[], int u) {
dist[u] = timp++;
color[u] = GRI;
if (!graph[u].empty()) {
//printf("%d %ld\n",u, graph[u].size());
for (int i = 0; i < (int)graph[u].size(); i++) {
if (color[graph[u][i]] == ALB) {
p[i] = u;
explore(p, color, graph, timp, dist, graph[u][i]);
}
}
}
color[u] = NEGRU;
}
void bfs(vector<vector<int> > &graph, int source, FILE * fout) {
//int p[graph.size()];
int dist[graph.size()];
int color[graph.size()];
for (int i = 0; i < (int) graph.size() ; i++) {
//p[i] = -1;
dist[i] = -1;
color[i] = ALB;
}
dist[source] = 0;
color[source] = GRI;
queue<int> q;
q.push(source);
while (!q.empty()){
int u = q.front();
q.pop();
for (int i = 0; i < (int)graph[u].size(); i++) {
int v = graph[u][i];
if(color[v] == ALB) {
dist[v] = dist[u] + 1;
//p[v] = u;
color[v] = GRI;
q.push(v);
}
}
color[u] = NEGRU;
}
for (int i = 1; i < (int) graph.size() ; i++) {
fprintf(fout, "%d ", dist[i]);
}
printf("\n");
}
int main() {
int N = 0, M = 0;// S = 0;
// FILE * fin = fopen(FILE_IN_BFS, "r");
// FILE * fout = fopen(FILE_OUT_BFS, "w");
FILE * fin_dfs = fopen(FILE_IN_DFS, "r");
FILE * fout_dfs = fopen(FILE_OUT_DFS, "w");
assert(fin_dfs != NULL);
assert(fout_dfs != NULL);
// assert(fscanf(fin_dfs, "%d %d %d\n", &N, &M, &S) == 3);
assert(fscanf(fin_dfs, "%d %d\n", &N, &M) == 2);
vector<vector<int> > graph;
for (int i = 0; i <= N; i++) {
vector<int> v;
//printf("%d\n", v.empty());
graph.push_back(v);
}
for (int i = 0; i < M; i++) {
int u, v;
assert(fscanf(fin_dfs, "%d %d\n", &u, &v) == 2);
graph[u].push_back(v);
graph[v].push_back(u);
}
// for (int i = 1; i <= N; i++) {
// printf("%d: ", i);
// for (int j = 0; j <(int) graph[i].size(); j++) {
// printf("%d, ", graph[i][j]);
// }
// printf("\n");
// }
//bfs(graph, S, fout);
dfs(graph, fout_dfs);
fclose(fin_dfs);
fclose(fout_dfs);
return 0;
}