#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int n,m,fa[N];
int find(int x){
if(x==fa[x])return x;
else return fa[x] = find(fa[x]);
}
void merge(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy){
if(fx<fy)fa[fy] = fx;
else fa[fx] = fy;
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=3*n;i++){
fa[i] = i;
}
int res = 0;
for(int i=1;i<=m;i++){
int pos,x,y;
cin>>pos>>x>>y;
if(x>n || y>n){
res++;
continue;
}
if(pos==2 && x==y){
res++;
continue;
}
if(pos==1){
if(find(x)==find(y+n) || find(x+n)==find(y+2*n) || find(x+2*n)==find(y)){
res++;
continue;
}
if(find(y)==find(x+n) || find(y+n)==find(x+2*n) || find(y+2*n)==find(x)){
res++;
continue;
}
merge(x,y);merge(x+n,y+n);merge(x+n+n,y+n+n);
}
if(pos==2){
//x吃y x->y+n x+n->y+2*n x+2*n->y
if(find(x)==find(y) || find(x+n)==find(y+n) || find(x+2*n)==find(y+2*n)){
res++;
continue;
}
if(find(y)==find(x+n) || find(y+n)==find(x+2*n) || find(y+2*n)==find(x)){
res++;
continue;
}
merge(x,y+n);merge(x+n,y+n+n);merge(x+n+n,y);
}
}
cout<<res<<endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
vector<int>e[N],g[N];
int n,m,book[N],dfn[N],low[N],tot,num,a[N],sum[N],id[N],u[N],v[N];
int f[N],in[N],out[N];
stack<int>stk;
void tarjan(int x){
dfn[x] = low[x] = ++tot;
stk.push(x);
book[x] = 1;
for(auto v:e[x]){
if(!dfn[v]){
tarjan(v);
low[x] = min(low[x],low[v]);
}
else if(book[v])low[x] = min(low[x],dfn[v]);
}
if(low[x]==dfn[x]){
int v;
num++;
do{
v = stk.top();stk.pop();book[v]=0;
id[v] = num;
sum[num]+=a[v];
}while(v!=x);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
u[i] = x,v[i] = y;
e[x].push_back(y);
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
for(int i=1;i<=m;i++){
int x = id[u[i]],y=id[v[i]];
if(x!=y){
g[x].push_back(y);
in[y]++;
}
}
queue<int>q;
int res = 0;
for(int i=1;i<=num;i++){
if(in[i]==0){
f[i] = sum[i];
q.push(i);
}
res = max(res,sum[i]);
}
while(!q.empty()){
int tmp = q.front();
q.pop();
for(auto v:g[tmp]){
in[v]--;
if(in[v]==0)q.push(v);
f[v] = max(f[v],f[tmp]+sum[v]);
res = max(res,f[v]);
}
}
cout<<res<<endl;
return 0;
}