#ifndef _GLIBCXX_NO_ASSERT #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if __cplusplus >= 201103L #include #include #include #include #include #include #include #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if __cplusplus >= 201103L #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif using namespace std; using i64 = int64_t; using vi = vector; using vvi = vector; constexpr i64 MOD = 998244353; vi par; vi sz; 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) { if (sz[x] == sz[y]) { if (x > y) swap(x, y); par[y] = x; sz[x] += sz[y]; } else { if (sz[x] < sz[y]) { swap(x, y); } par[y] = x; sz[x] += sz[y]; } } } bool same(int x, int y) { return find(x) == find(y); } int main() { int n; cin >> n; par = vi(n); iota(par.begin(), par.end(), 0); sz = vi(n, 1); int m; cin >> m; for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; a--; b--; if (!same(a, b)) { unite(a, b); } } for (int i = 0; i < n; i++) { cout << find(i) + 1 << endl; } }