#include <bits/stdc++.h>
using namespace std;
#define TASK "FILE"

#define ll long long
#define endl '\n'
#define el cout << '\n'
#define pii pair<int, int>
#define pll pair<ll, ll>
#define fi first
#define se second
#define pb push_back
#define SZ(v) (int)((v).size()) 
#define ms(A, n) memset((A), (n), sizeof((A)))
#define ALL(v) (v).begin(), (v).end()
#define FOR(i, a, b) for(int i = (a); i <= (b); i++)
#define FORD(i, a, b) for(int i = (a); i >= (b); i--)
#define FORX(x, v) for(auto x : (v))

#define MASK(x) (1 << (x))
#define BIT(i, x) (((x) >> (i)) & 1)
#define _TANHNV_ signed main()

template <class X, class Y>
bool maximize(X &x, const Y &y){
    return (x < y) ? (x = y), 1 : 0; 
}
template <class X, class Y>
bool minimize(X &x, const Y &y){
    return (x > y) ? (x = y), 1 : 0; 
}

const int maxn = 1e6 + 5;
const ll MOD = 1e9 + 7;
const int inf = 2e9;
const ll INF = 2e18;
const int LOG = 19;

/* END OF TEMPLATE */

int n, m;
vector<pii> adj[maxn];
struct edge{int u, v, id;};
pii canh[maxn];
vector<pii> Amst[maxn];
bool in[maxn];
int h[maxn];
pii par[maxn];
int ans[maxn];

struct DSU{
    int n;
    vector<int> root;
    void init(int _n = 0){
        n = _n;
        root.assign(n + 2, 0);
        FOR(u, 1, n){
            root[u] = u;
        }
    }

    int getRoot(int u){return (u == root[u]) ? u : root[u] = getRoot(root[u]);}

    bool unite(int u, int v){
        u = getRoot(u);
        v = getRoot(v);
        if(u == v) return 0;
        if(h[u] > h[v]) swap(u, v);
        root[v] = u;
        return 1;
    }
} dsu;

void dfs(int u, int p){
    FORX(e, Amst[u]){
        int v = e.fi, id = e.se;
        if(v == p) continue;
        h[v] = h[u] + 1;
        par[v] = {u, id};
        dfs(v, u);
    }
}

void inp(){
    cin >> n >> m;
    FOR(i, 1, m){
        int u, v; cin >> u >> v;
        if(u > v) swap(u, v);
        canh[i] = {u, v};
    }
}

void sol(){
    dsu.init(n);
    FOR(id, 1, m){
        int u = canh[id].fi, v = canh[id].se;
        if(dsu.unite(u, v)){
            in[id] = 1;
            Amst[u].pb({v, id});
            Amst[v].pb({u, id});
        }
    }
    dfs(1, 1);

    DSU cc;
    cc.init(n);
    FOR(id, 1, m){
        int u = canh[id].fi, v = canh[id].se;
        if(!in[id]){
            ans[id] = id;
            int ru = cc.getRoot(u), rv = cc.getRoot(v);
            while(ru != rv){
                if(h[ru] > h[rv]) swap(ru, rv);
                cc.unite(par[rv].fi, rv);
                ans[par[rv].se] = id;
                rv = cc.getRoot(rv);
            }
        }
    }

    FOR(i, 1, m) cout << ((ans[i] == 0) ? -1 : ans[i]) << " ";
}

_TANHNV_{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    if(fopen(TASK".inp", "r")){
        freopen(TASK".inp", "r", stdin);
        freopen(TASK".out", "w", stdout);
    }
    inp();
    sol();
    return 0;
}
