#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
priority_queue<pair<int, int>, vector<pair<int, int> >,
               greater<pair<int, int> > >
    q;
vector<int> v[maxn];
int ans[maxn], flag[maxn], a[maxn];
int x, n, m;
int f[maxn][3];
void dfs(int x) {
  flag[x] = 1;
  for (int i = 0; i < v[x].size(); ++i) {
    int y = v[x][i];
    if (ans[y] != -1) continue;
    if (f[y][0] == x) {
      ans[y] = 1;
      if (f[y][1] != 0 && !flag[f[y][1]]) dfs(f[y][1]);
    } else {
      ans[y] = 0;
      if (f[y][0] != 0 && !flag[f[y][0]]) dfs(f[y][0]);
    }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; ++i) ans[i] = -1;
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &a[i]);
    for (int j = 1; j <= a[i]; ++j) {
      scanf("%d", &x);
      v[i].push_back(abs(x));
      if (x > 0) {
        if (f[x][1] != 0) {
          ans[x] = 1;
          flag[f[x][1]] = flag[i] = 1;
        }
        f[x][1] = i;
      } else {
        x = -x;
        if (f[x][0] != 0) {
          ans[x] = 0;
          flag[f[x][0]] = flag[i] = 1;
        }
        f[x][0] = i;
      }
    }
  }
  for (int i = 1; i <= m; ++i) {
    if (f[i][1] == 0 && f[i][0] == 0) continue;
    if (f[i][1] == 0) {
      ans[i] = 0;
      flag[f[i][0]] = 1;
    }
    if (f[i][0] == 0) {
      ans[i] = 1;
      flag[f[i][1]] = 1;
    }
  }
  for (int i = 1; i <= n; ++i) {
    if (flag[i])
      dfs(i);
    else {
      q.push(make_pair(a[i], i));
    }
  }
  while (true) {
    while (q.size() > 0 && flag[q.top().second]) q.pop();
    if (q.size() == 0) break;
    if (q.top().first == 0) {
      printf("NO\n");
      return 0;
    }
    int dqid = q.top().second;
    flag[dqid] = 1;
    int dq = 0;
    q.pop();
    for (int i = 0; i < v[dqid].size(); ++i) {
      if (ans[v[dqid][i]] != -1) continue;
      if (dq == 0) {
        if (f[v[dqid][i]][0] == dqid) {
          ans[v[dqid][i]] = 0;
          a[f[v[dqid][i]][1]]--;
          q.push(make_pair(a[f[v[dqid][i]][1]], f[v[dqid][i]][1]));
        } else {
          ans[v[dqid][i]] = 1;
          a[f[v[dqid][i]][0]]--;
          q.push(make_pair(a[f[v[dqid][i]][0]], f[v[dqid][i]][0]));
        }
        dq = 1;
        continue;
      }
      if (f[v[dqid][i]][0] == dqid) {
        ans[v[dqid][i]] = 1;
        dfs(f[v[dqid][i]][1]);
      } else {
        ans[v[dqid][i]] = 0;
        dfs(f[v[dqid][i]][0]);
      }
    }
  }
  for (int i = 1; i <= n; ++i) {
    if (flag[i] == 0) {
      printf("NO\n");
      return 0;
    }
  }
  printf("YES\n");
  for (int i = 1; i <= m; ++i)
    if (ans[i] == 1)
      printf("1");
    else
      printf("0");
  return 0;
}
