#include using namespace std; #define FOR(i,a,b) for(int i=(a);i<(b);i++) #define REP(i,n) FOR(i,0,n) #define ALL(v) (v).begin(),(v).end() #define fi first #define se second template inline bool chmax(A &a, B b) { if (a inline bool chmin(A &a, B b) { if (a>b) { a=b; return 1; } return 0; } typedef long long ll; typedef pair pii; typedef pair pll; typedef pair pip; const ll INF = 1ll<<29; const ll MOD = 1000000007; const double EPS = 1e-10; const bool debug = 0; //---------------------------------// struct UnionFind { vector par, rank; vector cnt; UnionFind(int n) { par.resize(n); rank.resize(n); cnt.resize(n); REP(i, n) { par[i] = i; rank[i] = i; cnt[i] = 1; } } int operator[] (int x) { return find(x); } int find(int x) { if (x == par[x]) return x; return par[x] = find(par[x]); } void unite(int x, int y) { x = find(x); y = find(y); if (x == y) return; if (cnt[x] < cnt[y]) swap(x, y); else if (cnt[x] == cnt[y]) { if (rank[x] > rank[y]) swap(x, y); } par[y] = x; cnt[x] += cnt[y]; } bool same(int x, int y) { return find(x) == find(y); } int size(int x) { return cnt[find(x)]; } }; int N, M; int main() { cin >> N >> M; UnionFind uf(11234); REP(i, M) { int a, b; scanf("%d %d", &a, &b); a--; b--; uf.unite(a, b); } REP(i, N) printf("%d\n", uf[i] + 1); return 0; }