#include <bits/stdc++.h>
#define rep(i,n) for(int i=1;i<=n;++i)
#define N 100005
using namespace std;
int b[N],v[N<<1],f[N<<1],ne[N<<1],tot=0;
int mx1[N],pos[N],mx2[N],ans[N<<1],n,m,x,y,z;
void add(int x,int y,int z){
	v[++tot]=y,f[tot]=b[x],b[x]=tot;
	if(z==1)return;
	v[++tot]=x,f[tot]=b[y],b[y]=tot;
	ne[tot]=tot-1,ne[tot-1]=tot;
}
int inn[N];
bool dfs(int x,int fa){
	inn[x]=1;int tp;
	for(;b[x];b[x]=f[b[x]])if(b[x]!=fa){
		if(inn[v[b[x]]]==1||dfs(v[b[x]],ne[b[x]]))return 1;
		if(pos[v[b[x]]]==ne[b[x]])tp=mx2[v[b[x]]];else tp=mx1[v[b[x]]];++tp;
		if(tp>mx1[x])mx2[x]=mx1[x],mx1[x]=tp,pos[x]=b[x];else if(tp>mx2[x])mx2[x]=tp;
	}else break;
	for(int i=f[b[x]];i;f[b[x]]=f[f[b[x]]],i=f[b[x]]){
		if(inn[v[i]]==1||dfs(v[i],ne[i]))return 1;
		if(pos[v[i]]==ne[i])tp=mx2[v[i]];else tp=mx1[v[i]];++tp;
		if(tp>mx1[x])mx2[x]=mx1[x],mx1[x]=tp,pos[x]=i;else if(tp>mx2[x])mx2[x]=tp;
	}
	inn[x]=0;return 0;
}
int main(){
	scanf("%d%d",&n,&m);int ss=0;
	rep(i,m)scanf("%d%d%d",&x,&y,&z),add(x,y,z);
	rep(i,n)if(dfs(i,0)){puts("Infinite");return 0;}
	rep(i,n)ss=max(ss,mx1[i]);
	printf("%d\n",ss);
	return 0;
}