import
java.util.ArrayList;
import
java.util.List;
public
class
Main {
static
void
printLeftPath(
int
i,
int
j,
int
K) {
if
((K &
1
) ==
1
) {
for
(
int
p =
0
; p < K; p++) {
if
((p &
1
) ==
1
) {
System.out.print(i +
" "
);
}
else
{
System.out.print(j +
" "
);
}
}
}
else
{
for
(
int
p =
0
; p < K; p++) {
if
((p &
1
) ==
1
) {
System.out.print(j +
" "
);
}
else
{
System.out.print(i +
" "
);
}
}
}
}
static
void
printRightPath(
int
j,
int
k,
int
K) {
if
((K &
1
) ==
1
) {
for
(
int
p =
0
; p < K; p++) {
if
((p &
1
) ==
1
) {
System.out.print(k +
" "
);
}
else
{
System.out.print(j +
" "
);
}
}
}
else
{
for
(
int
p =
0
; p < K; p++) {
if
((p &
1
) ==
1
) {
System.out.print(k +
" "
);
}
else
{
System.out.print(j +
" "
);
}
}
}
}
static
void
constructPalindromicPath(List<Pair<Pair<Integer, Integer>, Character>> edges,
int
n,
int
K) {
char
[][] adj =
new
char
[n +
1
][n +
1
];
for
(Pair<Pair<Integer, Integer>, Character> edge : edges) {
int
i = edge.getKey().getKey();
int
j = edge.getKey().getValue();
char
weight = edge.getValue();
adj[i][j] = weight;
}
if
((K &
1
) ==
1
) {
System.out.println(
"YES"
);
for
(
int
i =
0
; i <= K; i++) {
System.out.print((i &
1
) +
1
+
" "
);
}
return
;
}
boolean
found =
false
;
int
idx1 =
0
, idx2 =
0
;
for
(
int
i =
1
; i <= n; i++) {
for
(
int
j =
1
; j <= n; j++) {
if
(i != j && adj[i][j] == adj[j][i]) {
found =
true
;
idx1 = i;
idx2 = j;
break
;
}
}
if
(found)
break
;
}
if
(found) {
System.out.println(
"YES"
);
for
(
int
i =
0
; i <= K; i++) {
System.out.print((i &
1
) ==
1
? idx1 +
" "
: idx2 +
" "
);
}
return
;
}
else
{
List<Integer>[] mp1 =
new
ArrayList[n +
1
];
List<Integer>[] mp2 =
new
ArrayList[n +
1
];
for
(
int
i =
1
; i <= n; i++) {
mp1[i] =
new
ArrayList<>();
mp2[i] =
new
ArrayList<>();
for
(
int
j =
1
; j <= n; j++) {
if
(i != j) {
if
(adj[i][j] ==
'0'
) {
mp1[i].add(j);
}
else
{
mp2[i].add(j);
}
}
}
}
for
(
int
i =
1
; i <= n; i++) {
for
(
int
j =
1
; j <= n; j++) {
if
(i != j && adj[i][j] ==
'0'
) {
if
(!mp1[j].isEmpty()) {
int
k = mp1[j].get(
0
);
if
(k != i && k != j) {
System.out.println(
"YES"
);
K -=
2
;
K /=
2
;
printLeftPath(i, j, K);
System.out.print(i +
" "
+ j +
" "
+ k +
" "
);
printRightPath(j, k, K);
return
;
}
}
}
}
}
for
(
int
i =
1
; i <= n; i++) {
for
(
int
j =
1
; j <= n; j++) {
if
(i != j && adj[i][j] ==
'1'
) {
if
(!mp1[j].isEmpty()) {
int
k = mp1[j].get(
0
);
if
(k != i && k != j) {
System.out.println(
"YES"
);
K -=
2
;
K /=
2
;
printLeftPath(i, j, K);
System.out.print(i +
" "
+ j +
" "
+ k +
" "
);
printRightPath(j, k, K);
return
;
}
}
}
}
}
}
System.out.println(
"NO"
);
}
public
static
void
main(String[] args) {
int
N =
3
, K =
4
;
List<Pair<Pair<Integer, Integer>, Character>> edges =
new
ArrayList<>();
edges.add(
new
Pair<>(
new
Pair<>(
1
,
2
),
'1'
));
edges.add(
new
Pair<>(
new
Pair<>(
1
,
3
),
'1'
));
edges.add(
new
Pair<>(
new
Pair<>(
2
,
1
),
'1'
));
edges.add(
new
Pair<>(
new
Pair<>(
2
,
3
),
'1'
));
edges.add(
new
Pair<>(
new
Pair<>(
3
,
1
),
'0'
));
edges.add(
new
Pair<>(
new
Pair<>(
3
,
2
),
'0'
));
constructPalindromicPath(edges, N, K);
}
static
class
Pair<K, V> {
private
K key;
private
V value;
Pair(K key, V value) {
this
.key = key;
this
.value = value;
}
public
K getKey() {
return
key;
}
public
V getValue() {
return
value;
}
}
}