#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC target( \
    "sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#pragma GCC optimize("unroll-loops")
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int maxn = 3e5 + 113;
vector<int> gr[maxn];
vector<int> antigr[maxn];
int color[maxn];
bool used[maxn];
vector<int> sp;
void dfs(int v) {
  used[v] = 1;
  for (int to : gr[v])
    if (!used[to]) dfs(to);
  sp.push_back(v);
}
void dfs2(int v, int c) {
  color[v] = c;
  for (int to : antigr[v])
    if (!color[to]) dfs2(to, c);
}
void dfs3(int v) {
  used[v] = 1;
  for (int to : gr[v])
    if (!used[to]) dfs3(to);
}
void add(int a, int b) {
  gr[a].push_back(b);
  antigr[b].push_back(a);
}
pair<bool, vector<int>> solve(vector<pair<int, int>> sd, int v) {
  for (int i = 1; i <= 2 * v + 2; i++) {
    gr[i].clear();
    antigr[i].clear();
    color[i] = 0;
    used[i] = 0;
  }
  sp.clear();
  int n = v + 1;
  for (int i = 0; i < sd.size(); i++) {
    int a = sd[i].first, b = sd[i].second;
    add(n - a, n + b);
    add(n + b, n - a);
    add(n - b, n + a);
    add(n + a, n - b);
  }
  for (int i = 1; i <= 2 * v + 2; i++)
    if (!used[i]) dfs(i);
  int co = 1;
  for (int i = sp.size() - 1; i >= 0; i--)
    if (!color[sp[i]]) dfs2(sp[i], co++);
  vector<int> out;
  bool tr = true;
  for (int i = 1; i <= 2 * v + 2; i++) used[i] = 0;
  for (int i = 1; i <= v; i++) {
    if (color[n + i] == color[n - i]) tr = false;
    if (used[n + i] || used[n - i]) {
      if (used[n + i])
        out.push_back(i);
      else
        out.push_back(-i);
      continue;
    }
    if (color[n + i] < color[n - i]) {
      out.push_back(-i);
      dfs3(n - i);
    } else {
      out.push_back(i);
      dfs3(n + i);
    }
  }
  return {tr, out};
}
vector<int> dl[maxn];
bool vm[maxn];
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.setf(ios::fixed);
  cout.precision(3);
  int n, m;
  cin >> n >> m;
  vector<pair<int, int>> zp;
  for (int i = 1; i <= m; i++) {
    int a, b, c;
    cin >> a >> b >> c;
    if (c)
      zp.push_back({-a, b});
    else
      zp.push_back({a, b});
  }
  pair<bool, vector<int>> df = solve(zp, n);
  if (!df.first)
    cout << "Impossible";
  else {
    vector<int> of;
    for (int i = 0; i < df.second.size(); i++) {
      if (df.second[i] > 0) of.push_back(df.second[i]);
    }
    cout << of.size() << "\n";
    for (int i = 0; i < of.size(); i++) cout << of[i] << " ";
  }
}
