#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
char memarr[ 96000000 ] ;
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
struct unionFind{
int * d;
int N;
int M;
inline void malloc ( const int n) {
d = ( int * ) std:: malloc ( n* sizeof ( int ) ) ;
M = n;
}
inline void free ( void ) {
std:: free ( d) ;
}
inline void walloc( const int n, void ** mem= & wmem) {
walloc1d( & d, n, mem) ;
M = n;
}
inline void init( const int n) {
int i;
N = n;
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
d[ i] = - 1 ;
}
}
inline void init( void ) {
init( M) ;
}
inline int get( int a) {
int t = a;
int k;
while ( d[ t] >= 0 ) {
t= d[ t] ;
}
while ( d[ a] >= 0 ) {
k= d[ a] ;
d[ a] = t;
a= k;
}
return a;
}
inline int connect( int a, int b) {
if ( d[ a] >= 0 ) {
a= get( a) ;
}
if ( d[ b] >= 0 ) {
b= get( b) ;
}
if ( a== b) {
return 0 ;
}
if ( d[ a] < d[ b] ) {
d[ a] + = d[ b] ;
d[ b] = a;
}
else {
d[ b] + = d[ a] ;
d[ a] = b;
}
return 1 ;
}
inline int operator( ) ( int a) {
return get( a) ;
}
inline int operator( ) ( int a, int b) {
return connect( a,b) ;
}
inline int & operator[ ] ( const int a) {
return d[ a] ;
}
inline int size( int a) {
a = get( a) ;
return - d[ a] ;
}
inline int sizeList( int res[ ] ) {
int i;
int sz= 0 ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
if ( d[ i] < 0 ) {
res[ sz++ ] = - d[ i] ;
}
}
return sz;
}
}
;
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
class Solution{
public :
int makeConnected( int n, vector< vector< int >> & e) {
int i;
dummy_main( ) ;
int res = n - 1 ;
unionFind uf;
if ( e.size ( ) < n- 1 ) {
return - 1 ;
}
uf.walloc ( n) ;
uf.init ( n) ;
for ( i= ( 0 ) ; i< ( e.size ( ) ) ; i++ ) {
res - = uf( e[ i] [ 0 ] , e[ i] [ 1 ] ) ;
}
return res;
}
}
;
// cLay varsion 20200119-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// class Solution {
// public:
// int makeConnected(int n, vector<vector<int>>& e) {
// dummy_main();
// int res = n - 1;
// unionFind uf;
// if(e.size() < n-1) return -1;
// uf.walloc(n);
// uf.init(n);
// rep(i, e.size()) res -= uf(e[i][0], e[i][1]);
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZvaWQgKndtZW07CmNoYXIgbWVtYXJyWzk2MDAwMDAwXTsKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMWQoVCAqKmFyciwgaW50IHgsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgc3RhdGljIGludCBza2lwWzE2XSA9IHswLCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxfTsKICAoKm1lbSkgPSAodm9pZCopKCAoKGNoYXIqKSgqbWVtKSkgKyBza2lwWygodW5zaWduZWQgbG9uZyBsb25nKSgqbWVtKSkgJiAxNV0gKTsKICAoKmFycik9KFQqKSgqbWVtKTsKICAoKm1lbSk9KCgqYXJyKSt4KTsKfQpzdHJ1Y3QgdW5pb25GaW5kewogIGludCAqZDsKICBpbnQgTjsKICBpbnQgTTsKICBpbmxpbmUgdm9pZCBtYWxsb2MoY29uc3QgaW50IG4pewogICAgZCA9IChpbnQqKXN0ZDo6bWFsbG9jKG4qc2l6ZW9mKGludCkpOwogICAgTSA9IG47CiAgfQogIGlubGluZSB2b2lkIGZyZWUodm9pZCl7CiAgICBzdGQ6OmZyZWUoZCk7CiAgfQogIGlubGluZSB2b2lkIHdhbGxvYyhjb25zdCBpbnQgbiwgdm9pZCAqKm1lbT0md21lbSl7CiAgICB3YWxsb2MxZCgmZCwgbiwgbWVtKTsKICAgIE0gPSBuOwogIH0KICBpbmxpbmUgdm9pZCBpbml0KGNvbnN0IGludCBuKXsKICAgIGludCBpOwogICAgTiA9IG47CiAgICBmb3IoaT0oMCk7aTwobik7aSsrKXsKICAgICAgZFtpXSA9IC0xOwogICAgfQogIH0KICBpbmxpbmUgdm9pZCBpbml0KHZvaWQpewogICAgaW5pdChNKTsKICB9CiAgaW5saW5lIGludCBnZXQoaW50IGEpewogICAgaW50IHQgPSBhOwogICAgaW50IGs7CiAgICB3aGlsZShkW3RdPj0wKXsKICAgICAgdD1kW3RdOwogICAgfQogICAgd2hpbGUoZFthXT49MCl7CiAgICAgIGs9ZFthXTsKICAgICAgZFthXT10OwogICAgICBhPWs7CiAgICB9CiAgICByZXR1cm4gYTsKICB9CiAgaW5saW5lIGludCBjb25uZWN0KGludCBhLCBpbnQgYil7CiAgICBpZihkW2FdPj0wKXsKICAgICAgYT1nZXQoYSk7CiAgICB9CiAgICBpZihkW2JdPj0wKXsKICAgICAgYj1nZXQoYik7CiAgICB9CiAgICBpZihhPT1iKXsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZihkW2FdIDwgZFtiXSl7CiAgICAgIGRbYV0gKz0gZFtiXTsKICAgICAgZFtiXSA9IGE7CiAgICB9CiAgICBlbHNlewogICAgICBkW2JdICs9IGRbYV07CiAgICAgIGRbYV0gPSBiOwogICAgfQogICAgcmV0dXJuIDE7CiAgfQogIGlubGluZSBpbnQgb3BlcmF0b3IoKShpbnQgYSl7CiAgICByZXR1cm4gZ2V0KGEpOwogIH0KICBpbmxpbmUgaW50IG9wZXJhdG9yKCkoaW50IGEsIGludCBiKXsKICAgIHJldHVybiBjb25uZWN0KGEsYik7CiAgfQogIGlubGluZSBpbnQmIG9wZXJhdG9yW10oY29uc3QgaW50IGEpewogICAgcmV0dXJuIGRbYV07CiAgfQogIGlubGluZSBpbnQgc2l6ZShpbnQgYSl7CiAgICBhID0gZ2V0KGEpOwogICAgcmV0dXJuIC1kW2FdOwogIH0KICBpbmxpbmUgaW50IHNpemVMaXN0KGludCByZXNbXSl7CiAgICBpbnQgaTsKICAgIGludCBzej0wOwogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGlmKGRbaV08MCl7CiAgICAgICAgcmVzW3N6KytdID0gLWRbaV07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzejsKICB9Cn0KOwojZGVmaW5lIG1haW4gZHVtbXlfbWFpbgppbnQgbWFpbigpewogIHdtZW0gPSBtZW1hcnI7CiAgcmV0dXJuIDA7Cn0KI3VuZGVmIG1haW4KY2xhc3MgU29sdXRpb257CiAgcHVibGljOgogIGludCBtYWtlQ29ubmVjdGVkKGludCBuLCB2ZWN0b3I8dmVjdG9yPGludD4+JiBlKXsKICAgIGludCBpOwogICAgZHVtbXlfbWFpbigpOwogICAgaW50IHJlcyA9IG4gLSAxOwogICAgdW5pb25GaW5kIHVmOwogICAgaWYoZS5zaXplKCkgPCBuLTEpewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICB1Zi53YWxsb2Mobik7CiAgICB1Zi5pbml0KG4pOwogICAgZm9yKGk9KDApO2k8KGUuc2l6ZSgpKTtpKyspewogICAgICByZXMgLT0gdWYoZVtpXVswXSwgZVtpXVsxXSk7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH0KfQo7Ci8vIGNMYXkgdmFyc2lvbiAyMDIwMDExOS0xCgovLyAtLS0gb3JpZ2luYWwgY29kZSAtLS0KLy8gI2RlZmluZSBtYWluIGR1bW15X21haW4KLy8ge30KLy8gI3VuZGVmIG1haW4KLy8gCi8vIGNsYXNzIFNvbHV0aW9uIHsKLy8gcHVibGljOgovLyAgIGludCBtYWtlQ29ubmVjdGVkKGludCBuLCB2ZWN0b3I8dmVjdG9yPGludD4+JiBlKSB7Ci8vICAgICBkdW1teV9tYWluKCk7Ci8vICAgICBpbnQgcmVzID0gbiAtIDE7Ci8vICAgICB1bmlvbkZpbmQgdWY7Ci8vICAgICBpZihlLnNpemUoKSA8IG4tMSkgcmV0dXJuIC0xOwovLyAgICAgdWYud2FsbG9jKG4pOwovLyAgICAgdWYuaW5pdChuKTsKLy8gICAgIHJlcChpLCBlLnNpemUoKSkgcmVzIC09IHVmKGVbaV1bMF0sIGVbaV1bMV0pOwovLyAgICAgcmV0dXJuIHJlczsKLy8gICB9Ci8vIH07Cg==