#include #include #include #include #include #include using namespace std; int N, M; typedef pair pt; vector< vector< int > > G; vector< set< int > > C; vector Vhod; map Izhod; vector< bool > visited; int maxColor = 1; int getColor(int u, int v) { int color = 1; set::iterator it1 = C[u].begin(); set::iterator it2 = C[v].begin(); while(it1 != C[u].end() || it2 != C[v].end()) { bool change = false; if(it1 != C[u].end() && color == *it1) { it1++; color++; change = true; } if(it2 != C[v].end() && color == *it2) { it2++; color++; change = true; } if(change) { while(it1 != C[u].end() && *it1 < color) ++it1; while(it2 != C[v].end() && *it2 < color) ++it2; } else { break; } } C[u].insert(color); C[v].insert(color); return color; } void solve(int start) { int u, v, color; queue q; q.push(start); visited[start] = true; while(!q.empty()) { u = q.front(); q.pop(); sort(G[u].begin(), G[u].end()); for(int i = 0; i < G[u].size(); ++i) { v = G[u][i]; if(visited[v]) continue; color = getColor(u, v); Izhod[make_pair(u,v)] = color; if(maxColor < color) maxColor = color; q.push(v); } visited[u] = true; } } int main() { freopen("gcoloring.in", "r", stdin); freopen("gcoloring.out", "w", stdout); int u, v; scanf("%d%d", &N, &M); G.resize(N + 1); visited.resize(N + 1); C.resize(N + 1); for(int i = 0; i < M; i++) { scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); Vhod.push_back(make_pair(u,v)); } solve(1); printf("%d\n", maxColor); for(int i = 0; i < Vhod.size(); ++i) printf(i != Vhod.size()- 1 ? "%d\n" : "%d", Izhod[Vhod[i]]); return 0; }