#include <bits/stdc++.h>
using namespace std;
struct node {
  int id, lowlink;
  vector<int> list;
  node() {
    id = 0;
    list.clear();
  }
};
class Tarjan {
 public:
  int n;
  vector<node> ar;
  int index;
  vector<int> visited;
  vector<vector<int> > component, edges;
  map<pair<int, int>, bool> mp;
  stack<int> st;
  Tarjan(int sze) {
    n = sze;
    ar.resize(n);
    visited.resize(n);
    edges.resize(n);
  }
  void init() {
    for (int i = 0; i < n; i++) {
      visited[i] = 0;
      index = 0;
    }
    component.clear();
    mp.clear();
    while (!st.empty()) st.pop();
  }
  void AddEdge(int from, int to) { (ar[from].list).push_back(to); }
  void dfs(int a) {
    ar[a].id = index;
    ar[a].lowlink = index;
    index++;
    int len = (ar[a].list).size();
    for (int i = 0; i < len; i++) {
      if (visited[ar[a].list[i]] == 0) {
        st.push(ar[a].list[i]);
        visited[ar[a].list[i]] = 1;
        dfs(ar[a].list[i]);
        ar[a].lowlink = min(ar[a].lowlink, ar[ar[a].list[i]].lowlink);
      } else if (visited[ar[a].list[i]] == 1) {
        ar[a].lowlink = min(ar[a].lowlink, ar[ar[a].list[i]].id);
      }
    }
    int now;
    vector<int> vec;
    vec.clear();
    if (ar[a].lowlink == ar[a].id) {
      int res = component.size();
      while (!st.empty()) {
        now = st.top();
        ar[now].lowlink = res;
        st.pop();
        vec.push_back(now);
        visited[now] = 2;
        if (now == a) break;
      }
      component.push_back(vec);
    }
  }
  void get_component() {
    init();
    for (int i = 0; i < n; i++) {
      if (visited[i] == 0) {
        st.push(i);
        visited[i] = 1;
        dfs(i);
      }
    }
    int u, v;
    for (int i = 0; i < n; i++) {
      u = ar[i].lowlink;
      for (int j = 0; j < (ar[i].list).size(); j++) {
        v = ar[ar[i].list[j]].lowlink;
        if (u != v && mp[make_pair(u, v)] == 0) {
          edges[u].push_back(v);
          mp[make_pair(u, v)] = 1;
        }
      }
    }
  }
};
class Sat2 {
 public:
  int n;
  vector<int> visited, value;
  vector<vector<int> > edges, cpy_edges;
  queue<int> qu;
  Sat2(int sze) {
    n = 2 * sze + 1;
    edges.resize(n);
    visited.resize(n);
    value.resize(n);
  }
  int get_node(int var) {
    if (var < 0) {
      return var + n;
    } else
      return var;
  }
  void AddClause(int var1, int var2) {
    edges[get_node(var1)].push_back(get_node(-var2));
    edges[get_node(var2)].push_back(get_node(-var1));
  }
  void dfs(int a) {
    if (visited[a]) return;
    visited[a] = 1;
    int len = cpy_edges[a].size();
    for (int i = 0; i < len; i++) {
      dfs(cpy_edges[a][i]);
    }
    qu.push(a);
  }
  bool satisfyable() {
    Tarjan obj(n);
    for (int i = 0; i < n; i++) {
      value[i] = -1;
      for (int j = edges[i].size() - 1; j >= 0; j--) {
        obj.AddEdge(i, edges[i][j]);
      }
    }
    obj.get_component();
    for (int i = 1; i < n; i++) {
      if ((obj.ar[i]).lowlink == (obj.ar[n - i]).lowlink) {
        return false;
      }
    }
    cpy_edges = obj.edges;
    int now;
    for (int i = 0; i < obj.component.size(); i++) {
      if (visited[i] == 0) {
        while (!qu.empty()) qu.pop();
        dfs(i);
        while (!qu.empty()) {
          now = qu.front();
          qu.pop();
          for (int j = 0; j < obj.component[now].size(); j++) {
            int tmp = obj.component[now][j];
            if (value[tmp] == -1) {
              value[tmp] = 1;
              value[n - tmp] = 0;
            }
          }
        }
      }
    }
    return true;
  }
};
void solve() {
  int n, m, a, b, c, ans;
  scanf("%d", &n);
  ;
  scanf("%d", &m);
  ;
  Sat2 obj(n + 1);
  for (int i = 0; i < m; i++) {
    scanf("%d", &a);
    ;
    scanf("%d", &b);
    ;
    scanf("%d", &c);
    ;
    if (c == 0) {
      obj.AddClause(a, b);
      obj.AddClause(-a, -b);
    } else {
      obj.AddClause(a, -b);
      obj.AddClause(-a, b);
    }
  }
  ans = obj.satisfyable();
  if (ans == 0) {
    cout << "Impossible\n";
    return;
  }
  ans = 0;
  for (int i = 1; i <= n; i++) {
    if (obj.value[i] == 1) {
      ans++;
    }
  }
  cout << ans << endl;
  for (int i = 1; i <= n; i++) {
    if (obj.value[i] == 1) {
      cout << i << " ";
    }
  }
  cout << endl;
}
int main() {
  int t = 1;
  for (int i = 1; i <= t; i++) {
    solve();
  }
}
