#include <bits/stdc++.h>   using namespace std;   template <class T>   inline bool uin(T& a, T b) {     return a > b ? (a = b, true) : false;   }   template <class T>   inline bool uax(T& a, T b) {     return a < b ? (a = b, true) : false;   }   const int nax = 5123;   pair<int, int> edge[nax];   vector<int> g[nax];   int col[nax];   int N, M;   bool cycle_found = false;   int dfs_num[nax];   void dfs(int v) {     dfs_num[v] = 1;     for (int i : g[v]) {       int ch = edge[i].first ^ edge[i].second ^ v;       if (dfs_num[ch] == 2) {         continue;       } else if (dfs_num[ch] == 1) {         col[i] = 1;         cycle_found = true;         continue;       }       dfs(ch);     }     dfs_num[v] = 2;   }   int main() {     ios::sync_with_stdio(false);     cin.tie(0);     cin >> N >> M;     for (int u, v, i = 0; i < M; ++i) {       cin >> u >> v;       --u, --v;       edge[i] = make_pair(u, v);       g[u].push_back(i);     }     for (int i = 0; i < N; ++i)       if (dfs_num[i] != 2) dfs(i);     cout << (cycle_found ? 2 : 1) <<   n ;     for (int i = 0; i < M; ++i) cout << col[i] + 1 <<    n [i == M - 1];   }   