#include <bits/stdc++.h>
using namespace std;

#define rep(a,b) for(int a=0; a<b; ++a)

using ll=long long;
using pi=pair<int,int>;

template<typename T>
using vec=vector<T>;
template<typename T>
using mat=vector<vec<T>>;

mat<int> dist;
mat<pi> gr;

void dijkstra(int s){
	priority_queue<pi,vec<pi>,greater<pi>> que;
	dist[s][s]=0;
	que.emplace(dist[s][s],s);
	while(!que.empty()){
		int cost,idx;
		tie(cost,idx)=que.top(); que.pop();
		if(dist[s][idx]<cost) continue;
		for(auto &e:gr[idx]){
			int ncos=cost+e.second;
			if(dist[s][e.first]<=ncos) continue;
			dist[s][e.first]=ncos;
			que.emplace(dist[s][e.first],e.first);
		}
	}
}

int main(void){
	int N,R; cin>>N>>R;
	dist.resize(N,vec<int>(N,INT_MAX));
	gr.resize(N);
	rep(i,R){
		int s,t,d; cin>>s>>t>>d;
		--s,--t; gr[s].emplace_back(pi(t,d)),gr[t].emplace_back(pi(s,d));
	}
	rep(i,N) dijkstra(i);
	
	int longest=0;
	for(int i=0; i<N; ++i){
		for(int j=i+1; j<N; ++j){
			longest=max(longest,dist[i][j]);
		}
	}
	
	vec<bool> unuse(N,true);
	vec<pi> course;
	for(int i=0; i<N; ++i){
		for(int j=i+1; j<N; ++j){
			if(dist[i][j]==longest){
				course.emplace_back(i,j);
				unuse[i]=unuse[j]=false;
			}
		}
	}
	
	vec<int> ans;
	for(int i=0; i<N; ++i){
		if(!unuse[i]) continue;
		for(int j=0; j<course.size(); ++j){
			int x=course[j].first,y=course[j].second;
			if(dist[x][i]+dist[i][y]==dist[x][y]){
				unuse[i]=false; break;
			}
		}
		if(unuse[i]) ans.emplace_back(i+1);
	}
	
	cout<<ans.size()<<endl;
	for(auto &e:ans) cout<<e<<endl;
}
