#include #include #include #include using namespace std; using namespace atcoder; using namespace __gnu_pbds; using ll=long long; using ld=long double; using vll=vector; using vvll=vector; using pll=pair; // using mint=modint; // template // using ordered_map=tree,rb_tree_tag,tree_order_statistics_node_update>; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); //色で箱を分類、同じ色の中辺をはる(連結すればいい)、連結成分ごとマージを行います(回数は連結成分の頂点数-1) ll N,M; cin>>N>>M; dsu uf(M); vll first(N,-1); ll ans=0; for(int i=0;i>b>>c; b--,c--; if(first[c]==-1){ first[c]=b; }else{ if(!uf.same(first[c],b))uf.merge(first[c],b),ans++; } } cout<