import
java.util.ArrayList;
import
java.util.Collections;
import
java.util.List;
class
Graph {
private
int
V;
private
List<List<Integer>> adj;
public
Graph(
int
V) {
this
.V = V;
adj =
new
ArrayList<>(V);
for
(
int
i =
0
; i < V; i++) {
adj.add(
new
ArrayList<>());
}
}
public
void
addPair(
int
v,
int
w) {
if
(v >=
0
&& v < V && w >=
0
&& w < V) {
adj.get(v).add(w);
adj.get(w).add(v);
}
else
{
System.err.println(
"Invalid vertex indices: "
+ v +
" or "
+ w);
}
}
public
void
countAll(
int
v, List<Integer> group,
boolean
[] visited) {
visited[v] =
true
;
group.add(v +
1
);
for
(
int
neighbor : adj.get(v)) {
if
(!visited[neighbor]) {
countAll(neighbor, group, visited);
}
}
}
public
List<List<Integer>> disjointSets() {
boolean
[] visited =
new
boolean
[V];
List<List<Integer>> allSets =
new
ArrayList<>();
for
(
int
i =
0
; i < V; ++i) {
if
(!visited[i]) {
List<Integer> group =
new
ArrayList<>();
countAll(i, group, visited);
allSets.add(group);
}
}
return
allSets;
}
}
public
class
Main {
public
static
void
main(String[] args) {
String str =
"zcxfbe"
;
int
N =
6
;
int
[][] pairs = {{
0
,
1
}, {
0
,
2
}, {
3
,
5
}};
Graph g =
new
Graph(N);
for
(
int
[] pair : pairs) {
g.addPair(pair[
0
], pair[
1
]);
}
List<List<Integer>> disjointSets = g.disjointSets();
List<Integer> key =
new
ArrayList<>();
List<Character> value =
new
ArrayList<>();
for
(
int
i =
0
; i < disjointSets.size(); ++i) {
List<Character> semians =
new
ArrayList<>();
for
(
int
j : disjointSets.get(i)) {
semians.add(str.charAt(j -
1
));
}
Collections.sort(semians);
Collections.sort(disjointSets.get(i));
value.addAll(semians);
key.addAll(disjointSets.get(i));
}
char
[] ans =
new
char
[N];
for
(
int
i =
0
; i < N; ++i) {
ans[key.get(i) -
1
] = value.get(i);
}
System.out.println(
new
String(ans));
}
}