#include<stdio.h>
#include<algorithm>
#include<vector.h>
using namespace std;

#define sz size()
#define pb push_back

int t,y,cnt,brc,res,resx[22555],br[22555],ul[22555],iz[22555];
bool mark[22555],moze[22555],pods[22555];
vector<int> a[22555],adj[22555],sin[22555];

bool upodstablu(int x, int y) {
    return ( ul[x]>=ul[y] && ul[x]<=iz[y] );
}

int sinupodstablu(int x, int y) {

    int l,r,m,q;

    l=0; r=sin[y].sz;
    while (l<=r) {
        m=(l+r)/2;
        q=sin[y][m];
        if ( ul[x]<ul[q] ) r=m-1;
        else if ( ul[x]>iz[q]) l=m+1;
        else return q;
    }
}


void idar(int x) {

    //printf("-> %d\n", x);

    int l,i;

    cnt++;
    ul[x]=cnt; iz[x]=123456789;

    mark[x]=true;

    l=adj[x].sz;
    for(i=0; i<l; i++) {
        y=adj[x][i];
        if (mark[y]) {
            if ( upodstablu(x,y) ) {
                pods[x]=false;
                brc++;
                t=sinupodstablu(x,y);
                br[t]++;
                //printf("-> %d %d %d\n", x, y, t);
            } else {
                pods[x]=false;
                pods[y]=false;
                //printf("~> %d %d\n", x, y);
            }
        }
    }

    l=a[x].sz;
    for(i=0; i<l; i++) {
        y=a[x][i];
        if (!mark[y]) {
           //brsin[x]++;
           //sin[x][brsin[x]]=y;
           sin[x].pb(y);
           idar(y);
           //o[y][0]=x;
           //for(i=1; i<=16; i++) o[y][i]=o[ o[y][i-1] ][i-1];
        }
    }


    iz[x]=cnt;
    return;
}

/*void idar5(int x) {

    l=adj[x].sz;
    for(i=0; i<l; i++) {
        y=adj[x][i];
        if (mark[y]) {
            brc++;
            t=lca(x,y);
            if ( t!=x && t!=y ) {
               br[t]++;
               br[y]--;
               br[x]--;
            } else if (t==x) {
               br[x]++;
               br[y]--;
            } else {
               br[x]--;
               br[y]++;
            }
        }
    }
    return;
}*/

void dfs(int x, int tr) {

    int p,l,i;

    p=tr+br[x];
    if (p==brc && moze[x]) {
        resx[res]=x;
        res++;
    }

    mark[x]=true;

    if (pods[x]) {
       l=a[x].sz;
       for(i=0; i<l; i++) {
           y=a[x][i];
           if (!mark[y]) dfs(y,p);
       }
    }
    return;
}

int main() {

    int n,m,i,j,x,y,z;

    FILE *ff = fopen("asfalt.in", "r"), *gg = fopen("asfalt.out", "w");

    fscanf(ff,"%d%d", &n, &m);

    for(i=0; i<=n; i++) {
       moze[i]=true;
       mark[i]=false;
       pods[i]=true;
       ul[i]=-1; iz[i]=-1;
       br[i]=0;
       //for(j=0; j<=16; j++) o[i][j]=-1;
    }

    for(i=0; i<m; i++) {
       fscanf(ff,"%d%d%d", &x, &y, &z);
       if (z==1) {
          a[x].pb(y);
          a[y].pb(x);
       } else {
          moze[x]=false;
          moze[y]=false;
          adj[x].pb(y);
          adj[y].pb(x);
       }
       //adj[x].pb(y);
       //adj[y].pb(x);
    }

    res=0; brc=0; cnt=0;
    idar(1);
    for(i=0; i<=n; i++) mark[i]=false;
    dfs(1,0);

    fprintf(gg,"%d\n", res);
    for(i=0; i<res; i++) fprintf(gg,"%d ", resx[i]);
    fprintf(gg,"\n");

    fclose(ff); fclose(gg);
    return 0;
}
