#include <bits/stdc++.h>
using namespace std;
vector<int> cid[401010];
int fnl[401010];
int value[401010];
struct Edge {
  int np, id;
  Edge *next;
} E[401010 * 2], *V[401010];
int tope = -1;
void addedge(int x, int y, int id) {
  E[++tope].np = y;
  E[tope].id = id;
  E[tope].next = V[x];
  V[x] = &E[tope];
}
vector<int> cent;
bool vis[401010];
void dfs(int now) {
  vis[now] = true;
  Edge *ne;
  for (ne = V[now]; ne; ne = ne->next) {
    if (vis[ne->np]) continue;
    fnl[ne->id] = ne->np;
    dfs(ne->np);
  }
}
bool vis2[401010];
int pnt[401010];
int pid[401010];
vector<int> circ;
bool findcirc(int now, int prvid) {
  vis2[now] = true;
  Edge *ne;
  for (ne = V[now]; ne; ne = ne->next) {
    if (ne->id == prvid) continue;
    if (vis2[ne->np]) {
      int x = now;
      while (x != ne->np) circ.push_back(x), x = pnt[x];
      circ.push_back(x);
      for (int i = 0; i < circ.size() - 1; i++)
        fnl[pid[circ[i]]] = pnt[circ[i]];
      fnl[ne->id] = now;
      return true;
    }
    pnt[ne->np] = now;
    pid[ne->np] = ne->id;
    if (findcirc(ne->np, ne->id)) return true;
  }
  return false;
}
int main() {
  int n, m;
  int x, y, z;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    int t;
    scanf("%d", &t);
    for (int j = 0; j < t; j++) {
      scanf("%d", &x);
      cid[abs(x)].push_back(i * (x < 0 ? -1 : 1));
    }
  }
  for (int i = 1; i <= m; i++) value[i] = -1;
  for (int i = 1; i <= m; i++) {
    if ((int)cid[i].size() == 0) continue;
    if ((int)cid[i].size() == 1) {
      value[i] = cid[i][0] < 0 ? 0 : 1;
      cent.push_back(abs(cid[i][0]));
      continue;
    }
    if ((long long)cid[i][0] * cid[i][1] > 0) {
      value[i] = cid[i][0] < 0 ? 0 : 1;
      cent.push_back(abs(cid[i][0]));
      cent.push_back(abs(cid[i][1]));
      continue;
    } else if (abs(cid[i][0]) == abs(cid[i][1])) {
      value[i] = 1;
      cent.push_back(abs(cid[i][0]));
    } else {
      addedge(abs(cid[i][0]), abs(cid[i][1]), i);
      addedge(abs(cid[i][1]), abs(cid[i][0]), i);
    }
  }
  for (int i = 0; i < cent.size(); i++) {
    if (vis[cent[i]]) continue;
    dfs(cent[i]);
  }
  for (int i = 1; i <= n; i++) {
    if (vis[i]) continue;
    circ.clear();
    if (!findcirc(i, -1)) {
      printf("NO\n");
      return 0;
    }
    for (int j = 0; j < circ.size(); j++) vis[circ[j]] = true;
    for (int j = 0; j < circ.size(); j++) dfs(circ[j]);
  }
  for (int i = 1; i <= m; i++) {
    if (cid[i].size() == 2 && value[i] == -1) {
      if (fnl[i] == abs(cid[i][0])) {
        value[i] = cid[i][0] < 0 ? 0 : 1;
      } else {
        value[i] = cid[i][1] < 0 ? 0 : 1;
      }
    }
  }
  printf("YES\n");
  for (int i = 1; i <= m; i++) {
    if (value[i] == -1) value[i] = 0;
    printf("%d", value[i]);
  }
}
