#include <bits/stdc++.h>
int i, j, n, m;
bool killed[200100], visited[200100];
int vlist[200100][3];
int ans[200100];
inline int myabs(int a) { return a < 0 ? -a : a; }
inline int sign(int a) { return a / myabs(a); }
struct G {
  int ind[200100];
  int last[200100 * 2], e[200100 * 2], e_num[200100 * 2];
  int t;
  void addE(int a, int b, int ee) {
    t++;
    last[t] = ind[a];
    ind[a] = t;
    e[t] = b;
    e_num[t] = ee;
  }
} g;
inline void gen_ans_for_i(int i, int j) {
  if (vlist[i][0] == 1) {
    ans[i] = vlist[i][1] > 0 ? 1 : 0;
  } else {
    if (myabs(vlist[i][1]) == j) {
      ans[i] = vlist[i][1] > 0 ? 1 : 0;
    } else {
      ans[i] = vlist[i][2] > 0 ? 1 : 0;
    }
  }
}
bool dfs(int a, int fae) {
  if (visited[a] || killed[a]) {
    return true;
  }
  visited[a] = 1;
  int i;
  for (i = g.ind[a]; i; i = g.last[i]) {
    if (g.e_num[i] != fae)
      if (dfs(g.e[i], g.e_num[i])) {
        if (!killed[a]) {
          gen_ans_for_i(g.e_num[i], a);
          killed[a] = true;
        }
      }
  }
  return killed[a];
}
void dfs2(int a, int fae) {
  if (visited[a]) {
    return;
  }
  visited[a] = 1;
  int i;
  for (i = g.ind[a]; i; i = g.last[i]) {
    if (g.e_num[i] != fae)
      if (!killed[g.e[i]]) {
        killed[g.e[i]] = true;
        gen_ans_for_i(g.e_num[i], g.e[i]);
        dfs2(g.e[i], g.e_num[i]);
      }
  }
  return;
}
int main() {
  scanf("%d %d", &n, &m);
  int a, b;
  for (i = 1; i <= n; i++) {
    scanf("%d", &j);
    while (j--) {
      scanf("%d", &a);
      b = myabs(a);
      vlist[b][0]++;
      if (a < 0) {
        vlist[b][vlist[b][0]] = -i;
      } else {
        vlist[b][vlist[b][0]] = i;
      }
    }
  }
  for (i = 1; i <= m; i++) {
    if (vlist[i][0] == 1) {
      killed[myabs(vlist[i][1])] = true;
      if (vlist[i][1] < 0) {
        ans[i] = 0;
      } else {
        ans[i] = 1;
      }
    } else if (vlist[i][0] == 2) {
      a = myabs(vlist[i][1]);
      b = myabs(vlist[i][2]);
      if (sign(vlist[i][1]) * sign(vlist[i][2]) > 0) {
        killed[a] = true;
        killed[b] = true;
        ans[i] = vlist[i][1] > 0 ? 1 : 0;
      } else {
        g.addE(a, b, i);
        g.addE(b, a, i);
      }
    }
  }
  for (i = 1; i <= n; i++) {
    if (!visited[i] && !killed[i]) {
      dfs(i, 0);
    }
  }
  memset(visited, 0, sizeof(visited));
  for (i = 1; i <= n; i++) {
    if (killed[i]) {
      dfs2(i, 0);
    }
  }
  for (i = 1; i <= n; i++) {
    if (!killed[i]) {
      printf("NO\n");
      return 0;
    }
  }
  printf("YES\n");
  for (i = 1; i <= m; i++) {
    printf("%d", ans[i]);
  }
  printf("\n");
  return 0;
}
