import
java.io.*;
import
java.util.*;
class
GFG
{
static
boolean
twoColorUtil(Vector<Integer>[] G,
int
src,
int
N,
int
[] colorArr)
{
colorArr[src] =
1
;
Queue<Integer> q =
new
LinkedList<>();
q.add(src);
while
(!q.isEmpty())
{
int
u = q.peek();
q.poll();
for
(
int
v =
0
; v < G[u].size(); ++v)
{
if
(colorArr[G[u].elementAt(v)] == -
1
)
{
colorArr[G[u].elementAt(v)] =
1
- colorArr[u];
q.add(G[u].elementAt(v));
}
else
if
(colorArr[G[u].elementAt(v)] == colorArr[u])
return
false
;
}
}
return
true
;
}
static
boolean
twoColor(Vector<Integer>[] G,
int
N)
{
int
[] colorArr =
new
int
[N +
1
];
for
(
int
i =
1
; i <= N; ++i)
colorArr[i] = -
1
;
for
(
int
i =
1
; i <= N; i++)
if
(colorArr[i] == -
1
)
if
(twoColorUtil(G, i, N, colorArr) ==
false
)
return
false
;
return
true
;
}
static
boolean
isOddSum(
int
[][] info,
int
n,
int
m)
{
Vector<Integer>[] G =
new
Vector[
2
* n];
for
(
int
i =
0
; i <
2
* n; i++)
G[i] =
new
Vector<>();
int
pseudo = n +
1
;
int
pseudo_count =
0
;
for
(
int
i =
0
; i < m; i++)
{
if
(info[i][
2
] %
2
==
1
)
{
int
u = info[i][
0
];
int
v = info[i][
1
];
G[u].add(v);
G[v].add(u);
}
else
{
int
u = info[i][
0
];
int
v = info[i][
1
];
G[u].add(pseudo);
G[pseudo].add(u);
G[v].add(pseudo);
G[pseudo].add(v);
pseudo_count++;
pseudo++;
}
}
return
twoColor(G, n + pseudo_count);
}
public
static
void
main(String[] args)
{
int
n =
4
, m =
3
;
int
[][] info = { {
1
,
2
,
12
}, {
2
,
3
,
1
},
{
4
,
3
,
1
}, {
4
,
1
,
20
} };
if
(isOddSum(info, n, m) ==
true
)
System.out.println(
"No"
);
else
System.out.println(
"Yes"
);
}
}