#include <bits/stdc++.h>
using namespace std;
int A, V;
bool bedsig[1000000][2];
int bedvar[1000000][2];
bool loesung[1000000];
vector<int> adj[1000000];
vector<int> radj[1000000];
bool vis[1000000];
vector<int> order;
int comp[1000000];
int compnr;
vector<int> incomp[1000000];
vector<int> adjcomp[1000000];
bool viscomp[1000000];
bool gesetzt[1000000];
void visitcomp(int i) {
  if (viscomp[i]) return;
  viscomp[i] = true;
  for (typeof((adjcomp[i]).begin()) it = (adjcomp[i]).begin();
       it != (adjcomp[i]).end(); it++)
    visitcomp(*it);
  if (gesetzt[comp[incomp[i][0] ^ 1]]) {
    for (typeof((incomp[i]).begin()) it = (incomp[i]).begin();
         it != (incomp[i]).end(); it++) {
      if ((*it) % 2)
        loesung[(*it) / 2] = false;
      else
        loesung[(*it) / 2] = true;
    }
  } else {
    gesetzt[i] = true;
    for (typeof((incomp[i]).begin()) it = (incomp[i]).begin();
         it != (incomp[i]).end(); it++) {
      if ((*it) % 2)
        loesung[(*it) / 2] = true;
      else
        loesung[(*it) / 2] = false;
    }
  }
}
void findeloesung() {
  for (int i = 0; i < compnr; i++) {
    incomp[i].clear();
    adjcomp[i].clear();
    viscomp[i] = false;
    gesetzt[i] = false;
  }
  for (int i = 0; i < 2 * V; i++) {
    incomp[comp[i]].push_back(i);
    for (typeof((adj[i]).begin()) it = (adj[i]).begin(); it != (adj[i]).end();
         it++)
      adjcomp[comp[i]].push_back(comp[*it]);
  }
  for (int i = 0; i < compnr; i++) visitcomp(i);
}
void dfs(int i) {
  if (vis[i]) return;
  vis[i] = true;
  for (typeof((adj[i]).begin()) it = (adj[i]).begin(); it != (adj[i]).end();
       it++)
    dfs(*it);
  order.push_back(i);
}
void dfsReverse(int i) {
  if (vis[i]) return;
  vis[i] = true;
  comp[i] = compnr;
  for (typeof((radj[i]).begin()) it = (radj[i]).begin(); it != (radj[i]).end();
       it++)
    dfsReverse(*it);
}
bool solve() {
  for (int i = 0; i < 2 * V; i++) {
    adj[i].clear();
    radj[i].clear();
  }
  for (int i = 0; i < A; i++) {
    int v0 = 2 * bedvar[i][0] + bedsig[i][0];
    int v1 = 2 * bedvar[i][1] + bedsig[i][1];
    adj[v0 ^ 1].push_back(v1);
    adj[v1 ^ 1].push_back(v0);
  }
  for (int i = 0; i < 2 * V; i++)
    for (typeof((adj[i]).begin()) it = (adj[i]).begin(); it != (adj[i]).end();
         it++)
      radj[*it].push_back(i);
  fill(vis, vis + 2 * V, false);
  order.clear();
  for (int i = 0; i < 2 * V; i++) dfs(i);
  reverse(order.begin(), order.end());
  fill(vis, vis + 2 * V, false);
  compnr = 0;
  for (int i = 0; i < 2 * V; i++)
    if (!vis[order[i]]) {
      dfsReverse(order[i]);
      compnr++;
    }
  for (int i = 0; i < V; i++)
    if (comp[2 * i] == comp[2 * i + 1]) return false;
  findeloesung();
  return true;
}
int main() {
  int N, M;
  scanf("%d%d", &N, &M);
  A = 0;
  V = N;
  for (int i = 0; i < M; i++) {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    a--;
    b--;
    bedsig[A][0] = false;
    bedvar[A][0] = a;
    bedsig[A][1] = c;
    bedvar[A][1] = b;
    A++;
    bedsig[A][0] = true;
    bedvar[A][0] = a;
    bedsig[A][1] = !c;
    bedvar[A][1] = b;
    A++;
  }
  if (solve()) {
    int x = 0;
    for (int i = 0; i < N; i++) x += loesung[i];
    printf("%d\n", x);
    bool fi = true;
    for (int i = 0; i < N; i++) {
      if (loesung[i]) {
        if (!fi) printf(" ");
        fi = false;
        printf("%d", i + 1);
      }
    }
  } else {
    printf("Impossible\n");
  }
  return 0;
}
