1 #include<iostream>
2 #include<cstdio>
3 #include<algorithm>
4 #include<cstring>
5 #include<cmath>
6 #define maxn 2200000
7 #define inf 0x3f3f3f3f
8 using namespace std;
9
10 struct et
11 {
12 int s,t,next;
13 long long val;
14 }e[maxn];
15 int q[maxn*5],c[maxn],fir[maxn];
16 bool inque[maxn];
17 long long d[maxn];
18 int n,m,tot,st;
19
20 bool spfa()
21 {
22 //for (int i=1;i<=n;i++) d[i]=-inf,c[i]=0,inque[i]=0;
23 //q[1]=st; inque[st]=1; d[st]=0;
24 for (int i=1;i<=n;i++) q[i]=i,d[i]=1,inque[i]=1,c[i]=1;
25 int head=0,tail=n;
26 while (head!=tail)
27 {
28 head=(head+1)%(n+1);
29 int now=q[head];
30 for (int j=fir[now];j;j=e[j].next)
31 {
32 int k=e[j].t;
33 if (d[now]+e[j].val>d[k])
34 {
35 d[k]=d[now]+e[j].val;
36 if (++c[k]>=n) return 0;
37 if (!inque[k])
38 {
39 tail=(tail+1)%(n+1);
40 q[tail]=k;
41 inque[k]=1;
42 }
43 }
44 }
45 inque[now]=0;
46 }
47 return 1;
48 }
49
50 void add(int x,int y,int z)
51 {
52 e[++tot].s=x; e[tot].t=y; e[tot].val=z;
53 e[tot].next=fir[x]; fir[x]=tot;
54 }
55
56 int main()
57 {
58 //freopen("candy.in","r",stdin);
59 scanf("%d %d",&n,&m);
60 st=n+1;
61 //for (int i=1;i<=n;i++) add(st,i,0);
62 int x,y,z;
63 for (int i=1;i<=m;i++)
64 {
65 scanf("%d %d %d",&x,&y,&z);
66 if (x==1) add(y,z,0),add(z,y,0);
67 else
68 if (x==2)
69 {
70 if (y==z) {printf("%d\n",-1) ; return 0;}
71 add(y,z,1);
72 }
73 else
74 if (x==3) add(z,y,0);
75 else
76 if (x==4)
77 {
78 if (y==z) {printf("%d\n",-1) ; return 0;}
79 add(z,y,1);
80 }
81 else
82 if (x==5) add(y,z,0);
83 }
84
85 long long ans=0;
86 if (spfa())
87 {
88 for (int i=1;i<=n;i++) ans+=d[i];
89 printf("%lld\n",ans);
90 }
91 else printf("%d\n",-1);
92 return 0;
93 }