internal Label GetRoot()
        {
            if (this.Root != this)
            {
                this.Root = this.Root.GetRoot();
            }

            return this.Root;
        }
 internal void Join(Label root2)
 {
     if (root2.Rank < this.Rank)//is the rank of Root2 less than that of Root1 ?
     {
         root2.Root = this;//yes! then Root1 is the parent of Root2 (since it has the higher rank)
     }
     else //rank of Root2 is greater than or equal to that of Root1
     {
         this.Root = root2;//make Root2 the parent
         if (this.Rank == root2.Rank)//both ranks are equal ?
         {
             root2.Rank++;//increment Root2, we need to reach a single root for the whole tree
         }
     }
 }