import sys
class DSU:
def __init__(self, size):
self.parent = list(range(size))
self.rank = [1] * size
def find(self, x):
if self.parent[x] != x:
self.parent[x] = self.find(self.parent[x])
return self.parent[x]
def union(self, x, y):
x_root = self.find(x)
y_root = self.find(y)
if x_root == y_root:
return False
if self.rank[x_root] < self.rank[y_root]:
self.parent[x_root] = y_root
self.rank[y_root] += self.rank[x_root]
else:
self.parent[y_root] = x_root
self.rank[x_root] += self.rank[y_root]
return True
def main():
data = sys.stdin.read().split()
ptr = 0
T = int(data[ptr])
ptr += 1
for _ in range(T):
N = int(data[ptr])
ptr += 1
e = int(data[ptr])
ptr += 1
dsu = DSU(N)
components = N
for __ in range(e):
a = int(data[ptr])
b = int(data[ptr + 1])
ptr += 2
if dsu.union(a, b):
components -= 1
print(components)
if __name__ == "__main__":
main()
aW1wb3J0IHN5cwoKY2xhc3MgRFNVOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemUpOgogICAgICAgIHNlbGYucGFyZW50ID0gbGlzdChyYW5nZShzaXplKSkKICAgICAgICBzZWxmLnJhbmsgPSBbMV0gKiBzaXplCiAgICAKICAgIGRlZiBmaW5kKHNlbGYsIHgpOgogICAgICAgIGlmIHNlbGYucGFyZW50W3hdICE9IHg6CiAgICAgICAgICAgIHNlbGYucGFyZW50W3hdID0gc2VsZi5maW5kKHNlbGYucGFyZW50W3hdKQogICAgICAgIHJldHVybiBzZWxmLnBhcmVudFt4XQogICAgCiAgICBkZWYgdW5pb24oc2VsZiwgeCwgeSk6CiAgICAgICAgeF9yb290ID0gc2VsZi5maW5kKHgpCiAgICAgICAgeV9yb290ID0gc2VsZi5maW5kKHkpCiAgICAgICAgaWYgeF9yb290ID09IHlfcm9vdDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgaWYgc2VsZi5yYW5rW3hfcm9vdF0gPCBzZWxmLnJhbmtbeV9yb290XToKICAgICAgICAgICAgc2VsZi5wYXJlbnRbeF9yb290XSA9IHlfcm9vdAogICAgICAgICAgICBzZWxmLnJhbmtbeV9yb290XSArPSBzZWxmLnJhbmtbeF9yb290XQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYucGFyZW50W3lfcm9vdF0gPSB4X3Jvb3QKICAgICAgICAgICAgc2VsZi5yYW5rW3hfcm9vdF0gKz0gc2VsZi5yYW5rW3lfcm9vdF0KICAgICAgICByZXR1cm4gVHJ1ZQoKZGVmIG1haW4oKToKICAgIGRhdGEgPSBzeXMuc3RkaW4ucmVhZCgpLnNwbGl0KCkKICAgIHB0ciA9IDAKICAgIFQgPSBpbnQoZGF0YVtwdHJdKQogICAgcHRyICs9IDEKICAgIGZvciBfIGluIHJhbmdlKFQpOgogICAgICAgIE4gPSBpbnQoZGF0YVtwdHJdKQogICAgICAgIHB0ciArPSAxCiAgICAgICAgZSA9IGludChkYXRhW3B0cl0pCiAgICAgICAgcHRyICs9IDEKICAgICAgICBkc3UgPSBEU1UoTikKICAgICAgICBjb21wb25lbnRzID0gTgogICAgICAgIGZvciBfXyBpbiByYW5nZShlKToKICAgICAgICAgICAgYSA9IGludChkYXRhW3B0cl0pCiAgICAgICAgICAgIGIgPSBpbnQoZGF0YVtwdHIgKyAxXSkKICAgICAgICAgICAgcHRyICs9IDIKICAgICAgICAgICAgaWYgZHN1LnVuaW9uKGEsIGIpOgogICAgICAgICAgICAgICAgY29tcG9uZW50cyAtPSAxCiAgICAgICAgcHJpbnQoY29tcG9uZW50cykKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBtYWluKCk=