#include <bits/stdc++.h>
using namespace std;
const int M = 300000;
int x[M][2], ans[M], color[M], color1[M];
bool hear[M];
vector<pair<int, int> > G[M];
void dfs1(int s) {
  color[s] = 1;
  for (int i = 0; i < G[s].size(); i++) {
    int v = G[s][i].first;
    if (color[v] == 0) {
      if (G[s][i].second > 0)
        ans[G[s][i].second] = 1;
      else
        ans[-G[s][i].second] = 0;
      dfs1(v);
    }
  }
  color[s] = 2;
}
pair<int, int> cyc;
void dfs2(int s, int per = -1) {
  color[s] = 1;
  for (int i = 0; i < G[s].size(); i++) {
    int v = G[s][i].first;
    if (color[v] == 0) {
      dfs2(v, abs(G[s][i].second));
    }
    if ((color[v] == 1) && (per != abs(G[s][i].second))) {
      cyc.first = s;
      cyc.second = i;
    }
  }
  color[s] = 2;
}
void dfs3(int s, int per) {
  color1[s] = 1;
  for (int i = 0; i < G[s].size(); i++) {
    int v = G[s][i].first;
    if (abs(G[s][i].second) == per) {
      continue;
    }
    if (color1[v] == 0) {
      ans[abs(G[s][i].second)] = (G[s][i].second > 0 ? 1 : 0);
      dfs3(v, abs(G[s][i].second));
    }
  }
  color1[s] = 2;
}
int main() {
  int n, m, r, k;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &k);
    for (int j = 0; j < k; j++) {
      scanf("%d", &r);
      if (!x[abs(r)][0])
        x[abs(r)][0] = i * (r > 0 ? 1 : -1);
      else
        x[abs(r)][1] = i * (r > 0 ? 1 : -1);
    }
  }
  for (int i = 1; i <= m; i++) {
    if ((x[i][0] >= 0) && (x[i][1] >= 0)) {
      ans[i] = 1;
      hear[x[i][0]] = 1;
      hear[x[i][1]] = 1;
    } else if ((x[i][0] <= 0) && (x[i][1] <= 0)) {
      ans[i] = 0;
      hear[-x[i][0]] = 1;
      hear[-x[i][1]] = 1;
    } else {
      int v1 = abs(x[i][0]), v2 = abs(x[i][1]);
      G[v1].push_back(make_pair(v2, i * (x[i][1] > 0 ? 1 : -1)));
      G[v2].push_back(make_pair(v1, i * (x[i][0] > 0 ? 1 : -1)));
    }
  }
  for (int i = 1; i <= n; i++)
    if ((hear[i]) && (!color[i])) dfs1(i);
  for (int i = 1; i <= n; i++)
    if (!color[i]) {
      cyc.first = 0;
      dfs2(i);
      if (cyc.first == 0) {
        puts("NO");
        return 0;
      } else {
        int s = cyc.first;
        int j = cyc.second;
        ans[abs(G[s][j].second)] = (G[s][j].second > 0 ? 1 : 0);
        dfs3(G[s][j].first, abs(G[s][j].second));
      }
    }
  puts("YES");
  for (int i = 1; i <= m; i++) cout << ans[i];
}
