#include <bits/stdc++.h>
using namespace std;
const int N=100010,M=400030;
int ver[M],edge[M],nxt[M],head[N],hc[N],tot;
int dfn[N],low[N],stk[N],scc[N],num,top,cnt;
bool ins[N];
int n,m,deg[N],dist[N];
void add(int h[],int x,int y,int z){
ver[++tot]=y,edge[tot]=z,nxt[tot]=h[x],h[x]=tot;
}
void tarjan(int x){
low[x]=dfn[x]=++num;
stk[++top]=x, ins[x]=true;
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}else if(ins[y])
low[x]=min(low[x],dfn[y]);
}
if(low[x]==dfn[x]){
cnt++;
int y;
do{
y=stk[top--];
ins[y]=false;
scc[y]=cnt;
}while(x!=y);
}
}
void topsort(){
queue<int> q;
q.push(scc[0]);
while(q.size()){
int x=q.front();
q.pop();
for(int i=hc[x];i;i=nxt[i]){
int y=ver[i];
dist[y]=max(dist[y],dist[x]+edge[i]);
if(--deg[y]==0)q.push(y);
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int t,a,b;
scanf("%d%d%d",&t,&a,&b);
if(t==1) add(head,a,b,0), add(head,b,a,0);
else if(t==2) add(head,a,b,1);
else if(t==3) add(head,b,a,0);
else if(t==4) add(head,b,a,1);
else add(head,a,b,0);
}
for(int i=1;i<=n;i++)
add(head,0,i,1);
for(int i=0;i<=n;i++)
if(!dfn[i]) tarjan(i);
for(int x=0;x<=n;x++){
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(scc[x]!=scc[y])
add(hc,scc[x],scc[y],edge[i]),deg[scc[y]]++;
else if(edge[i])
return puts("-1")&0;
}
}
topsort();
long long ans=0;
for(int i=1;i<=n;i++)
ans+=dist[scc[i]];
cout<<ans<<endl;
}