#include <bits/stdc++.h>
using namespace std;
const int maxe = 400010;
const int maxv = 400010;
struct HopcroftKarp {
  int nx, ny, E, adj[maxe], next[maxe], last[maxv], run[maxv], level[maxv],
      que[maxv], matx[maxv], maty[maxv];
  void init(int _nx, int _ny) {
    nx = _nx;
    ny = _ny;
    E = 0;
    memset(last, -1, sizeof(last));
    memset(matx, -1, sizeof(matx));
    memset(maty, -1, sizeof(maty));
  }
  void add(int x, int y) {
    adj[E] = y;
    next[E] = last[x];
    last[x] = E++;
  }
  bool bfs() {
    int qsize = 0;
    for (int x = (1); x <= (nx); ++x)
      if (matx[x] != -1)
        level[x] = -1;
      else {
        level[x] = 0;
        que[qsize++] = x;
      }
    bool found = false;
    for (int i = 0; i < (qsize); ++i) {
      for (int x = que[i], e = last[x]; e != -1; e = next[e]) {
        int y = adj[e];
        if (maty[y] == -1)
          found = true;
        else if (level[maty[y]] == -1) {
          level[maty[y]] = level[x] + 1;
          que[qsize++] = maty[y];
        }
      }
    }
    return found;
  }
  int dfs(int x) {
    for (int &e = run[x]; e != -1; e = next[e]) {
      int y = adj[e];
      if (maty[y] == -1 || (level[maty[y]] == level[x] + 1 && dfs(maty[y]))) {
        matx[x] = y;
        maty[y] = x;
        return 1;
      }
    }
    return 0;
  }
  int maxmat() {
    int total = 0;
    while (bfs()) {
      for (int x = (1); x <= (nx); ++x) run[x] = last[x];
      for (int x = (1); x <= (nx); ++x)
        if (matx[x] == -1) total += dfs(x);
    }
    return total;
  }
} hopkarp;
const int nm = 200010;
int n, m;
vector<int> a[nm], b[nm];
bool xoa[nm];
char kq[nm];
int cs[nm], csv[nm], n2, m2;
int main() {
  scanf("%d%d", &m, &n);
  for (int i = 1; i <= m; ++i) {
    int sl;
    scanf("%d", &sl);
    for (int j = 1; j <= sl; ++j) {
      int x;
      scanf("%d", &x);
      if (x > 0)
        a[x].push_back(i);
      else
        b[-x].push_back(i);
    }
  }
  for (int i = 1; i <= n; ++i) {
    if (a[i].size() == 0) {
      kq[i - 1] = '0';
      for (int j = 0; j < b[i].size(); ++j) xoa[b[i][j]] = 1;
    } else if (b[i].size() == 0) {
      kq[i - 1] = '1';
      for (int j = 0; j < a[i].size(); ++j) xoa[a[i][j]] = 1;
    }
  }
  m2 = 0;
  for (int i = 1; i <= m; ++i)
    if (!xoa[i]) {
      m2++;
      cs[i] = m2;
    }
  n2 = 0;
  for (int i = 1; i <= n; ++i)
    if (!kq[i - 1]) {
      n2++;
      csv[i] = n2;
    }
  hopkarp.init(n2, m2);
  for (int i = 1; i <= n; ++i) {
    if (csv[i]) {
      if (!xoa[a[i][0]]) hopkarp.add(csv[i], cs[a[i][0]]);
      if (!xoa[b[i][0]]) hopkarp.add(csv[i], cs[b[i][0]]);
    }
  }
  if (hopkarp.maxmat() != m2) {
    printf("NO\n");
    return 0;
  }
  for (int i = 1; i <= n; ++i)
    if (csv[i]) {
      int j = hopkarp.matx[csv[i]];
      if (j == cs[a[i][0]])
        kq[i - 1] = '1';
      else
        kq[i - 1] = '0';
    }
  printf("YES\n%s\n", kq);
}
