#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 2e5 + 10;
int n,k,idx = 1;
int head[MAXN << 1],dis[MAXN << 1],cnt[MAXN << 1];
bool vis[MAXN << 1];
struct node{
int v,w,nxt;
}edge[MAXN << 1];
inline void add(int u,int v,int w)
{
edge[idx].v = v;
edge[idx].w = w;
edge[idx].nxt = head[u];
head[u] = idx ++;
}
inline void bfs(int s)
{
memset(dis,0,sizeof(dis));
deque<int>q;
dis[s] = 1;
q.push_back(s);
while(!q.empty())
{
int u = q.front();
q.pop_front();
vis[u] = 0;
for(int i = head[u];i;i = edge[i].nxt)
{
int v = edge[i].v,w = edge[i].w;
if(dis[v] < dis[u] + w)
{
dis[v] = dis[u] + w;
if(!vis[v])
{
vis[v] = 1;
cnt[v] = cnt[u] + 1;
if(cnt[v] >= n)
{
printf("-1\n");
exit(0);
}
if(w) q.push_back(v);
else q.push_front(v);
}
}
}
}
}
signed main()
{
scanf("%lld %lld",&n,&k);
for(int i = 1;i <= n;i ++)
{
int x,u,v;
scanf("%lld %lld %lld",&x,&u,&v);
if(x == 1)
add(u,v,0),add(v,u,0);
if(x == 2)
{
if(u == v)
{
printf("-1\n");
return 0;
}
add(u,v,1);
}
if(x == 3)
add(v,u,0);
if(x == 4)
{
if(u == v)
{
printf("-1\n");
return 0;
}
add(v,u,1);
}
if(x == 5)
add(u,v,0);
}
for(int i = 1;i <= n;i ++) add(0,i,0);
bfs(0);
int Ans = 0;
for(int i = 1;i <= n;i ++)
Ans += dis[i];
printf("%lld\n",Ans);
return 0;
}