#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
int n,k,x,a,b,idx,h[N*2],dist[N],vis[N],num[N],ans;
struct Edge
{
int v,next,w;
}edge[N*2];
void add(int x,int y,int z)
{
edge[++idx].v=y;
edge[idx].next=h[x];
edge[idx].w=z;
h[x]=idx;
}
void spfa(int x)
{
queue<int> q;
memset(vis,0,sizeof(vis));
memset(dist,-0x3f,sizeof(dist));
memset(num,0,sizeof(num));
dist[x]=0;
vis[x]=1;
q.push(x);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=h[u];i;i=edge[i].next)
{
int j=edge[i].v,w=edge[i].w;
if(dist[j]<dist[u]+w)
{
dist[j]=dist[u]+w;
num[j]=num[u]+1;
if(num[j]>n)
{
printf("-1");
exit(0);
}
if(vis[j]==0)
{
q.push(j);
vis[j]=1;
}
}
}
}
}
signed main()
{
scanf("%lld%lld",&n,&k);
for(int i=n;i>=1;i--) add(0,i,1);
for(int i=1;i<=k;i++)
{
scanf("%lld%lld%lld",&x,&a,&b);
if(x==1)
{
add(a,b,0);
add(b,a,0);
}
if(x==2)
{
if(a==b)
{
printf("-1");
return 0;
}
add(a,b,1);
}
if(x==3) add(b,a,0);
if(x==4)
{
if(a==b)
{
printf("-1");
return 0;
}
add(b,a,1);
}
if(x==5) (a,b,0);
}
spfa(0);
for(int i=1;i<=n;i++) ans+=dist[i];
printf("%lld",ans);
return 0;
}