#include using namespace std; const int MAXN = (int) 1e5 + 5; int n, m; vector g[MAXN]; int parent[MAXN]; void init() { for (int i = 0; i < n; i++) { parent[i] = i; } } int findParent(int x) { return parent[x] = (parent[x] == x ? x : findParent(parent[x])); } void merge(int u, int v) { int pu = findParent(u); int pv = findParent(v); if (rand() % 2 == 0) { parent[pu] = pv; } else { parent[pv] = pu; } } int main() { int T; cin >> T; assert(T >= 1 && T <= 3); while (T--) { scanf("%d %d", &n, &m); assert(n >= 1 && n <= (int) 1e5); assert(m >= 0 && m <= (int) 2e5); assert(m >= 0 && m <= (long long) n * (n - 1) / 2LL); vector deg(n); for (int i = 0; i < n; i++) { deg[i] = 0; g[i].clear(); } set > st; for (int i = 0; i < m; i++) { int from, to; scanf("%d %d", &from, &to); assert(from >= 1 && from <= n); assert(to >= 1 && to <= n); assert(from != to); if (from > to) { swap(from, to); } st.insert(make_pair(from, to)); from--; to--; deg[from]++; deg[to]++; g[from].push_back(to); g[to].push_back(from); } assert(st.size() == m); vector vertices; for (int i = 0; i < n; i++) { vertices.push_back(i); } sort(vertices.begin(), vertices.end(), [°] (int x, int y) { return deg[x] > deg[y]; }); /* cerr << "vertices " << endl; for (auto x: vertices) { cerr << x << " "; } cerr << endl; */ init(); int components = n; int cur = 0; vector answer(n); set occured; for (int d = n - 1; d >= 0; d--) { vector v; while (cur < n && deg[vertices[cur]] > d) { v.push_back(vertices[cur]); cur++; } for (auto from: v) { occured.insert(from); } for (auto from: v) { for (auto to: g[from]) { if (occured.count(to)) { if (findParent(from) != findParent(to)) { merge(from, to); components--; //cerr << "d " << from << " " << to << " components " << components << endl; } } } } answer[d] = components - 1; } for (int i = 0; i < n; i++) { cout << answer[i]; if (i < n) { cout << " "; } } cout << endl; } return 0; }