#include <bits/stdc++.h>
#define N 100013
#define int long long
#define re register
#define INF 0x7f7f7f7f
using namespace std;
int n,m;
struct Edge{
int to,w,nxt;
}edge[N << 1];
int nbs[N],cnt;
inline void add(int u,int v,int w)
{
edge[++cnt].to = v;
edge[cnt].w = w;
edge[cnt].nxt = nbs[u];
nbs[u] = cnt;
}
int dis[N],tot[N];
bool vis[N];
queue<int>q;
inline bool spfa(int s)
{
fill(dis + 1,dis + n + 1,-INF);
memset(tot,0,sizeof tot);
memset(vis,0,sizeof vis);
dis[s] = 0; tot[s] = 1; vis[s] = 1;
q.push(s);
while(!q.empty())
{
int u = q.front();
q.pop();
vis[u] = 0;
if(++tot[u] == n) return false;
for(re int i=nbs[u];i;i=edge[i].nxt)
{
int to = edge[i].to,w = edge[i].w;
if(dis[u] + w > dis[to])
{
dis[to] = dis[u] + w;
if(!vis[to])
{
vis[to] = 1,q.push(to);
}
}
}
}
return true;
}
signed main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
scanf("%d%d",&n,&m);
for(re int i=1;i<=n;++i) add(0,i,1);
for(re int i=1;i<=m;++i)
{
int x,a,b;
scanf("%d%d%d",&x,&a,&b);
if(a == b) continue;
if(x == 1) add(a,b,0),add(b,a,0);//dis[b] <= dis[a] + 0,dis[a] <= dis[b] + 0;
if(x == 2)
{
if(a == b) return !printf("-1");
add(a,b,1);
}//dis[a] <= dis[b] - 1
if(x == 3) add(b,a,0);//dis[b] <= dis[a] + 0
if(x == 4){
if(a == b) return !printf("-1");
add(b,a,1);
}//dis[b] <= dis[a] - 1
if(x == 5) add(a,b,0);//dis[a] <= dis[b] + 0;
}
if(!spfa(0)) printf("-1");
else{
int ans = 0;
for(re int i=1;i<=n;++i) ans += dis[i];
printf("%lld",ans);
}
return 0;
}