#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
vector<int> G[N];
vector<pair<int, int> > vc[N];
int ans[N], done[N], deg[N];
priority_queue<pair<int, int> > Q;
void FAIL() {
  puts("NO");
  exit(0);
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int k, i = 1; i <= n; ++i) {
    scanf("%d", &k);
    deg[i] = k;
    for (int x, j = 0; j < k; ++j) {
      scanf("%d", &x);
      G[i].push_back(x);
      vc[abs(x)].push_back(make_pair(i, x > 0));
    }
  }
  memset(ans, -1, sizeof(ans));
  for (int i = 1; i <= m; ++i) {
    int sz = vc[i].size();
    if (sz == 1) {
      ans[i] = vc[i][0].second;
      done[vc[i][0].first] = 1;
    } else if (sz == 2 && vc[i][0].second == vc[i][1].second) {
      ans[i] = vc[i][0].second;
      done[vc[i][0].first] = done[vc[i][1].first] = 1;
    }
  }
  for (int i = 1; i <= n; ++i) {
    if (done[i]) continue;
    Q.push(make_pair(-deg[i], i));
  }
  while (!Q.empty()) {
    int u = Q.top().second;
    Q.pop();
    if (done[u]) continue;
    int t = -1;
    for (auto x : G[u]) {
      int v = abs(x);
      if (ans[v] != -1) continue;
      ans[t = v] = x > 0;
      done[u] = 1;
      for (auto y : vc[v]) {
        if (done[y.first]) continue;
        if (--deg[y.first] == 0) FAIL();
        Q.push(make_pair(-deg[y.first], y.first));
      }
      break;
    }
    if (t == -1) FAIL();
  }
  puts("YES");
  for (int i = 1; i <= m; ++i) {
    if (ans[i] == -1) ans[i] = 0;
    putchar('0' + ans[i]);
  }
  return 0;
}
