#include <bits/stdc++.h>
using namespace std;
vector<long long> ord;
vector<long long> comp(200000, 0);
void dfs1(long long v, vector<bool> &used, vector<vector<long long>> &graph) {
  used[v] = true;
  for (long long u : graph[v])
    if (!used[u]) dfs1(u, used, graph);
  ord.push_back(v);
}
void dfs2(long long v, vector<bool> &used, vector<vector<long long>> &graph,
          long long cnt) {
  used[v] = true;
  comp[v] = cnt;
  for (long long u : graph[v])
    if (!used[u]) dfs2(u, used, graph, cnt);
}
signed main() {
  long long n, m;
  cin >> n >> m;
  vector<pair<long long, long long>> a;
  vector<long long> b(m);
  for (long long i = 0; i < m; ++i) {
    long long x, y, z;
    cin >> x >> y >> z;
    --x;
    --y;
    a.push_back({x, y});
    b[i] = z;
  }
  vector<vector<long long>> graph(n * 2);
  vector<vector<long long>> graph2(n * 2);
  map<pair<long long, long long>, long long> d;
  for (long long i = 0; i < n; ++i) {
    for (long long j = 0; j < 2; ++j) d[{i, j}] = i * 2 + j;
  }
  for (long long k = 0; k < m; ++k) {
    long long i, j;
    i = a[k].first;
    j = a[k].second;
    if (b[k] == 0) {
      graph[d[{i, 0}]].push_back(d[{j, 1}]);
      graph[d[{j, 0}]].push_back(d[{i, 1}]);
      graph[d[{i, 1}]].push_back(d[{j, 0}]);
      graph[d[{j, 1}]].push_back(d[{i, 0}]);
      graph2[d[{i, 1}]].push_back(d[{j, 0}]);
      graph2[d[{j, 1}]].push_back(d[{i, 0}]);
      graph2[d[{i, 0}]].push_back(d[{j, 1}]);
      graph2[d[{j, 0}]].push_back(d[{i, 1}]);
    } else {
      graph[d[{i, 0}]].push_back(d[{j, 0}]);
      graph[d[{j, 0}]].push_back(d[{i, 0}]);
      graph[d[{i, 1}]].push_back(d[{j, 1}]);
      graph[d[{j, 1}]].push_back(d[{i, 1}]);
      graph2[d[{i, 0}]].push_back(d[{j, 0}]);
      graph2[d[{j, 0}]].push_back(d[{i, 0}]);
      graph2[d[{i, 1}]].push_back(d[{j, 1}]);
      graph2[d[{j, 1}]].push_back(d[{i, 1}]);
    }
  }
  vector<bool> used(n * 2, false);
  for (long long i = 0; i < 2 * n; ++i)
    if (!used[i]) dfs1(i, used, graph);
  reverse(ord.begin(), ord.end());
  for (long long i = 0; i < n * 2; ++i) used[i] = false;
  long long cnt = 1;
  for (long long i = 0; i < 2 * n; ++i) {
    long long u = ord[i];
    if (!used[u]) {
      dfs2(u, used, graph2, cnt);
      ++cnt;
    }
  }
  vector<long long> ans;
  for (long long i = 0; i < n; ++i) {
    if (comp[d[{i, 1}]] == comp[d[{i, 0}]]) {
      cout << "Impossible";
      return 0;
    }
    if (comp[d[{i, 0}]] > comp[d[{i, 1}]]) {
      ans.push_back(i);
    }
  }
  cout << ans.size() << '\n';
  for (long long i : ans) {
    cout << i + 1 << ' ';
  }
  ord.resize(0);
}
