#include <bits/stdc++.h>
using namespace std;
template <typename T>
using pr = pair<T, T>;
struct _2sat {
  int n;
  vector<vector<int>> g, gt;
  vector<bool> used;
  vector<int> order, comp;
  vector<bool> assignment;
  _2sat(vector<vector<int>> &gg) {
    g = gg;
    n = gg.size();
    gt = g;
  }
  void dfs1(int v) {
    used[v] = true;
    for (int u : g[v]) {
      if (!used[u]) dfs1(u);
    }
    order.push_back(v);
  }
  void dfs2(int v, int cl) {
    comp[v] = cl;
    for (int u : gt[v]) {
      if (comp[u] == -1) dfs2(u, cl);
    }
  }
  bool solve_2SAT() {
    used.assign(n, false);
    for (int i = 0; i < n; ++i) {
      if (!used[i]) dfs1(i);
    }
    comp.assign(n, -1);
    for (int i = 0, j = 0; i < n; ++i) {
      int v = order[n - i - 1];
      if (comp[v] == -1) dfs2(v, j++);
    }
    assignment.assign(n / 2, false);
    for (int i = 0; i < n; i += 2) {
      if (comp[i] == comp[i + 1]) return false;
      assignment[i / 2] = comp[i] > comp[i + 1];
    }
    return true;
  }
};
signed main() {
  int t = 1;
  while (t--) {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> g(2 * n);
    for (int i = 0; i < m; ++i) {
      int x, y, z;
      cin >> x >> y >> z;
      --x, --y;
      if (z == 0) {
        g[2 * x].push_back(2 * y + 1);
        g[2 * x + 1].push_back(2 * y);
        g[2 * y].push_back(2 * x + 1);
        g[2 * y + 1].push_back(2 * x);
      } else {
        g[2 * x].push_back(2 * y);
        g[2 * y].push_back(2 * x);
        g[2 * x + 1].push_back(2 * y + 1);
        g[2 * y + 1].push_back(2 * x + 1);
      }
    }
    _2sat xxx(g);
    bool f = xxx.solve_2SAT();
    if (!f) {
      cout << "Impossible";
      continue;
    }
    vector<int> alt;
    for (int i = 0; i < n; ++i) {
      if (xxx.assignment[i] == 1) alt.push_back(i + 1);
    }
    cout << alt.size() << '\n';
    for (int i = 0; i < alt.size(); ++i) cout << alt[i] << ' ';
    cout << '\n';
    ;
  }
}
