The problem can be solved either by repeated BFS after constructing a graph or by using a disjoint set. Disjoint set would be the fastest way and probably the only way to not get TLE 🙂 . Also, a map instead of array would be required to optimize in case you plan to use Java since N has max value of 10^9. One minor optimization would help the case which is to initialize the nodes just before the union step. Code is below:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
/**
* author: www.shankhs.com
*/
public class Main {
private static BufferedReader br;
static int count;
static class Node {
int data;
Node parent;
int rank;
}
private static Map<Integer, Node> tree;
private static void makeSet(int data) {
Node node = new Node();
node.data = data;
node.parent = node;
node.rank = 0;
tree.put(data, node);
}
private static boolean union(int x, int y) {
Node node1 = tree.get(x);
Node node2 = tree.get(y);
Node parent1 = findSet(node1);
Node parent2 = findSet(node2);
if (parent1.data == parent2.data) {
return false;
}
if (parent1.rank >= parent2.rank) {
parent1.rank = parent1.rank == parent2.rank ? parent1.rank + 1 : parent1.rank;
parent2.parent = parent1;
} else {
parent1.parent = parent2;
}
count--;
return true;
}
private static int findSet(int data) {
return findSet(tree.get(data)).data;
}
private static Node findSet(Node node) {
Node parent = node.parent;
if (parent == node) {
return parent;
}
parent = findSet(parent);
return parent;
}
public static void main(String[] args) throws Exception {
tree = new HashMap<>();
br = new BufferedReader(new InputStreamReader(System.in));
String[] ins = br.readLine().split(" ");
int n = Integer.valueOf(ins[0]);
int m = Integer.valueOf(ins[1]);
count = n;
for (int i = 0; i < m; i++) {
String[] rships = br.readLine().split(" ");
int foxling1 = Integer.valueOf(rships[0]);
int foxling2 = Integer.valueOf(rships[1]);
if (!tree.containsKey(foxling1)) {
makeSet(foxling1);
}
if (!tree.containsKey(foxling2)) {
makeSet(foxling2);
}
union(foxling1, foxling2);
}
System.out.println(count);
}
}