#include <bits/stdc++.h>
int cnt[505050];
std::vector<std::pair<int, int>> v[505050];
std::vector<int> ans;
void ppush(int idx) {
  for (int i = 0; i < v[idx].size(); i++) {
    if (cnt[v[idx][i].first] == 1) {
      ans.push_back(v[idx][i].second);
      cnt[v[idx][i].first] = 2;
    }
  }
  v[idx].clear();
}
long long powmod(long long a, long long n) {
  if (n == 0) return 1;
  if (n == 1) return a;
  long long b = powmod(a, n / 2);
  if ((n % 2) == 1) {
    return ((b * b) % (1000000007) * a) % (1000000007);
  } else {
    return (b * b) % (1000000007);
  }
}
int main(void) {
  std::cin.tie(0);
  std::ios_base::sync_with_stdio(false);
  int N, M;
  std::cin >> N >> M;
  int k, x, y;
  for (int i = 0; i < N; i++) {
    std::cin >> k;
    if (k == 1) {
      std::cin >> x;
      if (cnt[x] != 2) {
        ans.push_back(i);
      }
      cnt[x] = 2;
      ppush(x);
    } else {
      std::cin >> x >> y;
      if (cnt[x] && !cnt[y]) {
        ans.push_back(i);
        cnt[y] = 2;
        ppush(y);
      } else if (cnt[y] && !cnt[x]) {
        ans.push_back(i);
        cnt[x] = 2;
        ppush(x);
      } else if (!cnt[x] && !cnt[y]) {
        cnt[x]++;
        cnt[y]++;
        v[x].push_back({y, i});
        v[y].push_back({x, i});
      }
    }
  }
  for (int idx = 1; idx <= N; idx++) {
    for (int i = 0; i < v[idx].size(); i++) {
      if (cnt[v[idx][i].first] == 1) {
        ans.push_back(v[idx][i].second);
        cnt[v[idx][i].first] = 2;
      }
    }
  }
  std::sort(ans.begin(), ans.end());
  ans.erase(std::unique(ans.begin(), ans.end()), ans.end());
  std::cout << powmod(2, ans.size()) << " " << ans.size() << "\n";
  for (int i = 0; i < ans.size(); i++) {
    std::cout << ans[i] + 1 << " ";
  }
  return 0;
}
