#include <bits/stdc++.h>
using namespace std;
const long long inf = 2e18 + 7;
const long long mod = 1e9 + 7;
const double eps = 1e-12;
const double PI = 2 * acos(0.0);
const double E = 2.71828;
const int maxN = 2 * 100005;
int n, m;
set<int> clause[maxN];
set<pair<int, int> > best;
int res[maxN], pos[2 * maxN];
int main(void) {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; ++i) {
    int sz;
    scanf("%d", &sz);
    for (int j = 0; j < sz; ++j) {
      int x;
      scanf("%d", &x);
      pos[m + x] = i;
      clause[i].insert(x);
    }
    best.insert({sz, i});
  }
  while (!best.empty()) {
    pair<int, int> now = *best.begin();
    best.erase(best.begin());
    int id = now.second;
    if (!clause[id].size()) {
      puts("NO");
      exit(0);
    }
    int x = *clause[id].begin();
    if (x > 0) res[x] = 1;
    if (pos[m - x] != -1) {
      int sz = clause[pos[m - x]].size();
      clause[pos[m - x]].erase(-x);
      if (best.find({sz, pos[m - x]}) != best.end()) {
        best.erase({sz, pos[m - x]});
        best.insert({clause[pos[m - x]].size(), pos[m - x]});
      }
    }
  }
  puts("YES");
  for (int i = 1; i <= m; ++i) {
    printf("%d", res[i]);
  }
  printf("\n");
  return 0;
}
