#include <bits/stdc++.h>   using namespace std;   const int N = 2e5;   vector<int> g[N], used, g1[N];   int gl[N];   bool ok = 1;   void dfs(int v, int glb) {     used[v] = 1;     gl[v] = glb;     for (int to : g[v])       if (!used[to]) dfs(to, glb + 1);   }   void dfs1(int v, int root) {     used[v] = 1;     for (int to : g1[v])       if (to == root)         ok = 0;       else if (!used[to])         dfs1(to, root);   }   int32_t main() {     ios_base::sync_with_stdio(NULL);     cin.tie(0);     cout.tie(0);     int n, m;     cin >> n >> m;     map<pair<int, int>, int> q;     for (int i = 0; i < m; ++i) {       int a, b;       cin >> a >> b;       --a;       --b;       q[make_pair(a, b)] = i;       g[a].push_back(b);       g[b].push_back(a);       g1[a].push_back(b);     }     for (int i = 0; i < n; ++i) {       used.assign(n, 0);       dfs1(i, i);     }     used.assign(n, 0);     for (int i = 0; i < n; ++i)       if (!used[i]) dfs(i, 0);     if (ok) {       cout <<  1 n ;       for (int i = 0; i < m; ++i) cout <<  1  ;       return 0;     }     vector<int> res(m);     for (auto x : q) {       int a = x.first.first;       int b = x.first.second;       if (gl[a] > gl[b])         res[x.second] = 1;       else         res[x.second] = 2;     }     cout <<  2 n ;     for (int i = 0; i < m; ++i) cout << res[i] <<    ;   }   