#include <bits/stdc++.h>
using namespace std;
template <typename T>
istream& operator>>(istream& is, vector<T>& v) {
  for (T& x : v) is >> x;
  return is;
}
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  for (int i = 0; i < (int)v.size(); i++) {
    os << v[i] << (i + 1 == (int)v.size() ? "" : " ");
  }
  return os;
}
template <typename T, typename U>
ostream& operator<<(ostream& os, const pair<T, U>& p) {
  os << '(' << p.first << ',' << p.second << ')';
  return os;
}
template <typename T, typename U, typename V>
ostream& operator<<(ostream& os, const tuple<T, U, V>& t) {
  os << '(' << get<0>(t) << ',' << get<1>(t) << ',' << get<2>(t) << ')';
  return os;
}
template <typename T, typename U, typename V, typename W>
ostream& operator<<(ostream& os, const tuple<T, U, V, W>& t) {
  os << '(' << get<0>(t) << ',' << get<1>(t) << ',' << get<2>(t) << ','
     << get<3>(t) << ')';
  return os;
}
template <typename T, typename U>
ostream& operator<<(ostream& os, const map<T, U>& m) {
  os << '{';
  for (auto itr = m.begin(); itr != m.end();) {
    os << '(' << itr->first << ',' << itr->second << ')';
    if (++itr != m.end()) os << ',';
  }
  os << '}';
  return os;
}
template <typename T, typename U>
ostream& operator<<(ostream& os, const unordered_map<T, U>& m) {
  os << '{';
  for (auto itr = m.begin(); itr != m.end();) {
    os << '(' << itr->first << ',' << itr->second << ')';
    if (++itr != m.end()) os << ',';
  }
  os << '}';
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, const set<T>& s) {
  os << '{';
  for (auto itr = s.begin(); itr != s.end();) {
    os << *itr;
    if (++itr != s.end()) os << ',';
  }
  os << '}';
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, const multiset<T>& s) {
  os << '{';
  for (auto itr = s.begin(); itr != s.end();) {
    os << *itr;
    if (++itr != s.end()) os << ',';
  }
  os << '}';
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, const unordered_set<T>& s) {
  os << '{';
  for (auto itr = s.begin(); itr != s.end();) {
    os << *itr;
    if (++itr != s.end()) os << ',';
  }
  os << '}';
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, const deque<T>& v) {
  for (int i = 0; i < (int)v.size(); i++) {
    os << v[i] << (i + 1 == (int)v.size() ? "" : " ");
  }
  return os;
}
void debug_out() { cerr << '\n'; }
template <class Head, class... Tail>
void debug_out(Head&& head, Tail&&... tail) {
  cerr << head;
  if (sizeof...(Tail) > 0) cerr << ", ";
  debug_out(move(tail)...);
}
template <typename T>
T gcd(T x, T y) {
  return y != 0 ? gcd(y, x % y) : x;
}
template <typename T>
T lcm(T x, T y) {
  return x / gcd(x, y) * y;
}
template <class T1, class T2>
inline bool chmin(T1& a, T2 b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T1, class T2>
inline bool chmax(T1& a, T2 b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
const int INF = 1e9;
const long long IINF = 1e18;
const int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
const char dir[4] = {'D', 'R', 'U', 'L'};
const long long MOD = 1000000007;
namespace n91 {
using usize = std::size_t;
using u64 = std::uint64_t;
std::vector<bool> stob(std::string s) {
  std::vector<u64> num(s.size() / 9 + 10, 0);
  for (usize i = 0; i < s.size(); i += 9) {
    const std::string t = s.substr(i, 9);
    u64 mul = 1;
    u64 add = 0;
    for (const auto c : t) {
      add = add * 10 + (c - '0');
      mul *= 10;
    }
    for (auto& d : num) {
      d = d * mul + add;
      add = d >> 32;
      d -= add << 32;
    }
  }
  std::vector<bool> res(num.size() * 32);
  for (usize i = 0; i < num.size(); ++i) {
    for (usize j = 0; j < 32; ++j) {
      res[i * 32 + j] = num[i] >> j & 1;
    }
  }
  while (!res.empty() && !res.back()) {
    res.pop_back();
  }
  return res;
}
}  // namespace n91
const int MAX = 2048;
using u64 = uint64_t;
using BS = bitset<2 * MAX>;
BS calc(const string& s) {
  int n = s.size();
  vector<u64> num(n / 9 + 10, 0);
  for (int i = 0; i < n; i += 9) {
    string t = s.substr(i, 9);
    u64 mul = 1, add = 0;
    for (auto c : t) {
      add = add * 10 + (c - '0');
      mul *= 10;
    }
    for (auto& d : num) {
      d = d * mul + add;
      add = d >> 32;
      d -= add << 32;
    }
  }
  BS res;
  for (int i = 0; i < num.size(); i++) {
    for (int j = 0; j < 32; j++) {
      res[i * 32 + j] = num[i] >> j & 1;
    }
  }
  return res;
}
vector<BS> bases;
vector<int> idx(MAX, -1);
vector<int> solve(BS b, int x) {
  for (int i = MAX - 1; i >= 0; i--) {
    if (!b[i]) continue;
    if (~idx[i])
      b ^= bases[idx[i]];
    else {
      b.set(MAX + x, 1);
      idx[i] = bases.size();
      bases.emplace_back(b);
      return {};
    }
  }
  vector<int> res;
  for (int i = 0; i < MAX; i++) {
    if (b[MAX + i]) {
      res.emplace_back(i);
    }
  }
  return res;
};
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int m;
  cin >> m;
  for (int i = 0; i < m; i++) {
    string S;
    cin >> S;
    vector<int> ans = solve(calc(S), i);
    cout << ans.size();
    for (int x : ans) cout << ' ' << x;
    cout << '\n';
  }
  return 0;
}
