#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) {
  long long r;
  while (b != 0) {
    r = a % b;
    a = b;
    b = r;
  }
  return a;
}
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
const int maxn = 200010;
int n, m;
set<int> st[maxn];
set<pair<int, int> > li;
vector<int> v[maxn];
int ans[maxn];
void solve() {
  memset(ans, 0, sizeof(ans));
  scanf("%d%d", &n, &m);
  for (int i = (0); i < (n); i++) {
    int k;
    scanf("%d", &k);
    for (int j = (0); j < (k); j++) {
      int x;
      scanf("%d", &x);
      st[i].insert(x);
      v[abs(x)].push_back(i);
    }
    li.insert(make_pair(int((st[i]).size()), i));
  }
  while (int((li).size())) {
    set<pair<int, int> >::iterator it = li.begin();
    int i = it->second;
    li.erase(it);
    int k = *st[i].begin();
    ans[abs(k)] = k > 0 ? 1 : 0;
    for (int j = (0); j < (int((v[abs(k)]).size())); j++) {
      int u = v[abs(k)][j];
      if (u != i) {
        set<pair<int, int> >::iterator it =
            li.find(make_pair(int((st[u]).size()), u));
        if (it == li.end()) continue;
        li.erase(it);
        if (st[u].find(k) == st[u].end()) {
          st[u].erase(-k);
          if (int((st[u]).size()))
            li.insert(make_pair(int((st[u]).size()), u));
          else {
            printf("NO");
            return;
          }
        }
      }
    }
  }
  printf("YES\n");
  for (int i = (1); i < (m + 1); i++)
    if (ans[i])
      printf("1");
    else
      printf("0");
}
int main() {
  solve();
  return 0;
}
