using
System;
using
System.Collections.Generic;
class
DisjointSet
{
List<
int
> rank, parent, size;
public
DisjointSet(
int
n)
{
rank =
new
List<
int
>();
parent =
new
List<
int
>();
size =
new
List<
int
>();
for
(
int
i = 0; i <= n; i++) {
rank.Add(0);
parent.Add(i);
size.Add(1);
}
}
public
int
FindUPar(
int
node)
{
if
(node == parent[node]) {
return
node;
}
parent[node] = FindUPar(parent[node]);
return
parent[node];
}
public
void
UnionByRank(
int
u,
int
v)
{
int
ulp_u = FindUPar(u);
int
ulp_v = FindUPar(v);
if
(ulp_u == ulp_v) {
return
;
}
if
(rank[ulp_u] < rank[ulp_v]) {
parent[ulp_u] = ulp_v;
}
else
if
(rank[ulp_v] < rank[ulp_u]) {
parent[ulp_v] = ulp_u;
}
else
{
parent[ulp_v] = ulp_u;
rank[ulp_u]++;
}
}
public
void
UnionBySize(
int
u,
int
v)
{
int
ulp_u = FindUPar(u);
int
ulp_v = FindUPar(v);
if
(ulp_u == ulp_v) {
return
;
}
if
(size[ulp_u] < size[ulp_v]) {
parent[ulp_u] = ulp_v;
size[ulp_v] += size[ulp_u];
}
else
{
parent[ulp_v] = ulp_u;
size[ulp_u] += size[ulp_v];
}
}
}
class
Program {
static
void
dfs(
int
start, List<
int
>[] adj,
ref
List<
bool
> vis)
{
if
(vis[start]) {
return
;
}
vis[start] =
true
;
foreach
(
int
it
in
adj[start])
{
dfs(it, adj,
ref
vis);
}
}
static
void
Main(
string
[] args)
{
int
n = 6;
List<List<
int
> > connections =
new
List<List<
int
> >{
new
List<
int
>{ 0, 1 },
new
List<
int
>{ 0, 2 },
new
List<
int
>{ 0, 3 },
new
List<
int
>{ 1, 2 },
new
List<
int
>{ 1, 3 }
};
List<
int
>[] adj =
new
List<
int
>[ n + 1 ];
for
(
int
i = 0; i <= n; i++) {
adj[i] =
new
List<
int
>();
}
foreach
(List<
int
> con
in
connections)
{
adj[con[0]].Add(con[1]);
adj[con[1]].Add(con[0]);
}
DisjointSet ds =
new
DisjointSet(n);
int
extra = 0;
foreach
(List<
int
> con
in
connections)
{
if
(ds.FindUPar(con[0])
== ds.FindUPar(con[1])) {
extra++;
}
ds.UnionBySize(con[0], con[1]);
}
List<
bool
> visited =
new
List<
bool
>();
for
(
int
i = 0; i <= n; i++) {
visited.Add(
false
);
}
int
count = 0;
for
(
int
i = 0; i < n; i++) {
if
(!visited[i]) {
dfs(i, adj,
ref
visited);
count++;
}
}
if
(extra >= count - 1) {
Console.WriteLine(count - 1);
}
else
{
Console.WriteLine(
"Not possible"
);
}
}
}