#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
class T_SAT {
  vector<int> A[N], T[N];
  int tag[N], somev[N];
  vector<int> in[N];
  int incnt[N];
  vector<int> out[N];
  int noot[N];
  stack<int> S;
  bool vis1[N];
  void dfs1(int u) {
    vis1[u] = true;
    for (auto v : A[u])
      if (!vis1[v]) dfs1(v);
    S.push(u);
  }
  bool vis2[N];
  void dfs2(int u, int k) {
    vis2[u] = true;
    tag[u] = k;
    for (auto v : T[u])
      if (!vis2[v])
        dfs2(v, k);
      else if (tag[v] != k) {
        in[k].push_back(tag[v]);
        out[tag[v]].push_back(k);
      }
  }
  int dagN;
  void makeDag(int n) {
    memset(tag, -1, sizeof(tag));
    memset(vis1, 0, sizeof(vis1));
    memset(vis2, 0, sizeof(vis2));
    for (int i = 0; i < n; ++i)
      if (!vis1[i]) dfs1(i);
    dagN = 0;
    while (!S.empty()) {
      int u = S.top();
      S.pop();
      if (!vis2[u]) {
        somev[dagN] = u;
        dfs2(u, dagN++);
      }
    }
  }
  bool did[N];
  bool ans[N];
  queue<int> source;
  void remove(int x) {
    for (int u : out[x]) {
      incnt[u]--;
      if (incnt[u] == 0) source.push(u);
    }
  }
  bool solve() {
    int so;
    do {
      if (source.empty()) return true;
      so = source.front();
      source.pop();
    } while (did[so]);
    int si = tag[noot[somev[so]]];
    if (si == so) return false;
    ans[si] = 1;
    ans[so] = 0;
    did[si] = true;
    did[so] = true;
    remove(si);
    remove(so);
    return solve();
  }
  int satn = 0;
  int mapp[N];
  bool exist = false;

 public:
  T_SAT() { memset(mapp, -1, sizeof(mapp)); }
  bool Exist() { return exist; }
  bool Solve() {
    makeDag(satn);
    for (int i = 0; i < dagN; ++i)
      if (incnt[i] == 0) source.push(i);
    exist = solve();
    return exist;
  }
  void addClaw(int x1, int x2, bool b1, bool b2) {
    if (mapp[x1] == -1) {
      mapp[x1] = satn++;
      noot[mapp[x1]] = satn++;
      noot[noot[mapp[x1]]] = mapp[x1];
    }
    if (mapp[x2] == -1) {
      mapp[x2] = satn++;
      noot[mapp[x2]] = satn++;
      noot[noot[mapp[x2]]] = mapp[x2];
    }
    x1 = mapp[x1];
    if (b1) x1 = noot[x1];
    x2 = mapp[x2];
    if (b2) x2 = noot[x2];
    A[noot[x1]].push_back(x2);
    A[noot[x2]].push_back(x1);
    T[x1].push_back(noot[x2]);
    T[x2].push_back(noot[x1]);
  }
  bool Ans(int x) { return ans[tag[mapp[x]]]; }
} sat;
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < m; ++i) {
    int a, b, c;
    cin >> a >> b >> c;
    sat.addClaw(a, b, 0, c);
    sat.addClaw(a, b, 1, !c);
  }
  if (!sat.Solve()) {
    cout << "Impossible" << '\n';
    return 0;
  };
  int sum = 0;
  for (int i = 1; i < n + 1; ++i) sum += sat.Ans(i);
  cout << sum << '\n';
  for (int i = 1; i < n + 1; ++i)
    if (sat.Ans(i)) cout << i << ' ';
}
