public void Kruskal()

   int row, col;

   ArrayList work = new ArrayList();
   PriorityQueue pq;
   Set set = new Set(m_Size);     // Embedded class below

   clearFlags();
   for ( row = 0; row < m_Size; row++ )
      for ( col = row+1; col < m_Size; col++ )
         if ( m_Road[row][col] != null )
            work.add(new WtEdge(new CPair(row, col),
                     m_Road[row][col].m_Distance));
   pq = new PriorityQueue(work);

   while ( m_NextEdge < m_Size-1 && !pq.isEmpty() )
   { 
      WtEdge current = pq.remove();
      CPair  edge = current._item;
      int    src  = edge.m_First,
             dst  = edge.m_Second;
      int    set1 = set.find(src),
             set2 = set.find(dst);

      if ( set1 == set2 )
         continue;

      m_Sequence[m_NextEdge++] = edge;
      set.union(set1, set2);
   }
}