#include <bits/stdc++.h>
using namespace std;
const long long Maxn = 3e5 + 20;
const long long Max = 5e3 + 7;
const long long Mod = 1e9 + 7;
const long long Inf = 1e9 + 7;
vector<pair<bool, long long> > V[Maxn], G[Maxn];
bool mark[Maxn], vis[Maxn], Vis[Maxn], circle[Maxn];
queue<long long> q;
long long dad[Maxn], root, ans[Maxn];
void bfs() {
  while (q.size()) {
    long long u = q.front();
    q.pop();
    mark[u]++;
    for (long long i = 0; i < V[u].size(); i++) {
      long long v = V[u][i].second;
      if (G[v].size() > 1) {
        long long d = G[v][0].first, c = G[v][1].first;
        if (d == c) continue;
        long long t = G[v][0].second;
        if (t == u)
          t = G[v][1].second, ans[v] = d;
        else
          ans[v] = c;
        if (!mark[t]) q.push(t);
      }
    }
  }
}
void dfs(long long u) {
  vis[u]++;
  for (long long i = 0; i < V[u].size(); i++) {
    long long k = V[u][i].second, val = V[u][i].first;
    long long v = G[k][0].second;
    if (!Vis[k]) {
      Vis[k]++;
      if (v == u) v = G[k][1].second;
      if (!vis[v])
        dfs(v);
      else
        circle[v]++;
    }
  }
}
void DFS(long long u) {
  mark[u]++;
  for (long long i = 0; i < V[u].size(); i++) {
    long long k = V[u][i].second, val = V[u][i].first;
    long long v = G[k][0].second;
    if (v == u) v = G[k][1].second;
    if (ans[k] == 2) {
      ans[k] = !val;
      if (!mark[v]) DFS(v);
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  long long n, m;
  cin >> m >> n;
  for (long long i = 1; i <= m; i++) {
    long long Size;
    cin >> Size;
    for (long long j = 1; j <= Size; j++) {
      long long v;
      cin >> v;
      if (v < 0)
        V[i].push_back(make_pair(0, -v)), G[-v].push_back(make_pair(0, i));
      else
        V[i].push_back(make_pair(1, v)), G[v].push_back(make_pair(1, i));
    }
  }
  for (long long i = 1; i <= n; i++) ans[i] = 2;
  for (long long i = 1; i <= n; i++) {
    long long Size = G[i].size();
    if (!Size) continue;
    if (Size == 1) {
      q.push(G[i][0].second);
      ans[i] = G[i][0].first;
    } else {
      long long v = G[i][0].second, u = G[i][1].second;
      long long v1 = G[i][0].first, u1 = G[i][1].first;
      if (u1 == v1) ans[i] = v1, q.push(v), q.push(u);
      if (v == u) q.push(v), ans[i] = v1;
    }
  }
  bfs();
  for (long long i = 1; i <= m; i++)
    if (!mark[i] && !vis[i]) dfs(i);
  for (long long i = 1; i <= m; i++)
    if (!mark[i] && circle[i]) DFS(i);
  for (long long i = 1; i <= m; i++)
    if (!mark[i]) {
      cout << "NO" << endl;
      return 0;
    }
  cout << "YES" << endl;
  for (long long i = 1; i <= n; i++)
    if (ans[i] != 2)
      cout << ans[i];
    else
      cout << 0;
  cout << endl;
  return 0;
}
