#include <bits/stdc++.h>   using namespace std;   template <typename T0, typename T1>   bool chkmin(T0 &a, const T1 &b) {     return a > b ? a = b, 1 : 0;   }   template <typename T0, typename T1>   bool chkmax(T0 &a, const T1 &b) {     return a < b ? a = b, 1 : 0;   }   const int oo = 0x3f3f3f3f, Max_val = 314000000;   const int maxn = 100000, maxm = 100000;   int deg[maxn + 5];   pair<pair<int, int>, int> all[maxm + 5];   int tmp[maxm + 5] = {0};   vector<int> yyt[maxn + 5];   bool vis[maxn + 5] = {0};   int Min[maxn + 5];   int Max[maxn + 5];   vector<int> zzj[maxm + 5];   vector<int> owaski[maxn + 5];   int find(const int &first) {     if (vis[first]) return -2;     if (Max[first]) return Max[first];     vis[first] = 1;     Max[first] = -2;     for (int i = (0), _end_ = ((int((owaski[first]).size()))); i != _end_; ++i) {       const int &second = owaski[first][i];       int tmp = ::tmp[second];       for (int j = (0), _end_ = ((int((zzj[second]).size()))); j != _end_; ++j) {         const int &k = zzj[second][j];         int tmp0 = find(k);         if (tmp0 == -1)           goto yyt;         else if (tmp0 == -2)           tmp = -2;         else if (tmp != -2)           chkmin(tmp += tmp0, Max_val);       }       if (tmp == -2) {         Max[first] = -2;         vis[first] = 0;         return Max[first];       }       Max[first] = max(Max[first], tmp);     yyt:;     }     vis[first] = 0;     return Max[first];   }   int m, n;   int main() {     memset(Min, oo, sizeof Min);     scanf( %d%d , &m, &n);     for (int i = (0), _end_ = (m); i != _end_; ++i) {       scanf( %d , &all[i].first.first), --all[i].first.first;       static int nn;       scanf( %d , &nn);       all[i].first.second = tmp[i] = 0;       owaski[all[i].first.first].push_back(i);       for (int j = (0), _end_ = (nn); j != _end_; ++j) {         static int first;         scanf( %d , &first);         if (first == -1)           ++all[i].first.second, ++tmp[i];         else           --first, ++all[i].second, yyt[first].push_back(i),               zzj[i].push_back(first);       }     }     for (int i = (0), _end_ = (m); i != _end_; ++i)       if (!all[i].second) chkmin(Min[all[i].first.first], all[i].first.second);     priority_queue<pair<int, int>, vector<pair<int, int> >,                    greater<pair<int, int> > >         q;     for (int i = (0), _end_ = (n); i != _end_; ++i)       if (Min[i] < oo) q.push(make_pair(Min[i], i));     while (!q.empty()) {       int first = q.top().second;       q.pop();       if (vis[first]) continue;       vis[first] = 1;       for (int i = (0), _end_ = ((int((yyt[first]).size()))); i != _end_; ++i) {         const int &second = yyt[first][i];         all[second].first.second =             min(all[second].first.second + Min[first], Max_val);         if (!--all[second].second &&             chkmin(Min[all[second].first.first], all[second].first.second))           q.push(               make_pair(Min[all[second].first.first], all[second].first.first));       }     }     memset(vis, 0, sizeof vis);     memset(Max, 0, sizeof Max);     for (int i = (0), _end_ = (n); i != _end_; ++i)       if (Min[i] == oo) Min[i] = Max[i] = -1;     for (int i = (0), _end_ = (n); i != _end_; ++i) {       find(i);       printf( %d %d n , Min[i], Max[i]);     }     return 0;   }