#include <bits/stdc++.h>
using namespace std;
template <class T>
void debug(T a, T b) {
  ;
}
template <class T>
void chmin(T& a, const T& b) {
  if (a > b) a = b;
}
template <class T>
void chmax(T& a, const T& b) {
  if (a < b) a = b;
}
namespace std {
template <class S, class T>
ostream& operator<<(ostream& out, const pair<S, T>& a) {
  out << '(' << a.first << ',' << a.second << ')';
  return out;
}
}  // namespace std
long long int readL() {
  long long int res;
  scanf("%I64d", &res);
  return res;
}
void printL(long long int res) { printf("%I64d", res); }
int n, m;
vector<int> es[200005];
vector<pair<int, int> > g[200005];
bool ans[200005];
bool used[200005], mark[200005];
int sign(int a) {
  if (a > 0) return 1;
  if (a < 0) return -1;
  ;
  ;
  return 0;
}
void dfs(int v) {
  mark[v] = 1;
  while (!g[v].empty()) {
    pair<int, int> e = g[v].back();
    g[v].pop_back();
    ;
    ;
    ;
    ;
    ;
    ;
    if (used[abs(e.second) - 1]) {
      continue;
    }
    used[abs(e.second) - 1] = 1;
    ;
    ;
    ans[abs(e.second) - 1] = (sign(e.second) > 0 ? 1 : 0);
    dfs(e.first);
  }
}
bool vis2[200005];
int findcy(int v, int pid) {
  if (vis2[v]) return v;
  vis2[v] = 1;
  for (auto e : g[v]) {
    if (abs(e.second) == pid) continue;
    int r = findcy(e.first, abs(e.second));
    if (r >= 0) {
      return r;
    }
  }
  return -1;
}
void fail() {
  puts("NO");
  exit(0);
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < (n); ++i) {
    int c;
    scanf("%d", &c);
    for (int j = 0; j < (c); ++j) {
      int a;
      scanf("%d", &a);
      int id = abs(a) - 1;
      es[id].push_back((i + 1) * sign(a));
    }
  }
  for (int i = 0; i < (m); ++i) {
    if (es[i].empty()) continue;
    if (es[i].size() == 2 && sign(es[i][0]) != sign(es[i][1])) {
      int a = abs(es[i][0]) - 1, b = abs(es[i][1]) - 1;
      g[a].push_back(make_pair(b, (i + 1) * sign(es[i][1])));
      g[b].push_back(make_pair(a, (i + 1) * sign(es[i][0])));
    }
  }
  for (int i = 0; i < (m); ++i) {
    if (es[i].empty()) continue;
    if (es[i].size() == 2 && sign(es[i][0]) == sign(es[i][1])) {
      int a = abs(es[i][0]) - 1, b = abs(es[i][1]) - 1;
      ans[i] = (sign(es[i][0]) == 1 ? 1 : 0);
      mark[a] = mark[b] = 1;
    } else if (es[i].size() == 1) {
      int a = abs(es[i][0]) - 1;
      ans[i] = (sign(es[i][0]) == 1 ? 1 : 0);
      mark[a] = 1;
    }
  }
  debug(ans, ans + m);
  for (int i = 0; i < (n); ++i)
    if (mark[i]) {
      dfs(i);
    }
  debug(ans, ans + m);
  for (int i = 0; i < (n); ++i)
    if (!mark[i]) {
      int v = findcy(i, -1);
      if (v == -1) {
        fail();
      }
      dfs(v);
    }
  puts("YES");
  string res;
  debug(ans, ans + m);
  for (int i = 0; i < (m); ++i) res += (ans[i] ? "1" : "0");
  cout << res << endl;
  return 0;
}
