#include <bits/stdc++.h>
using namespace std;
template <typename T>
T gcd(T first, T second) {
  while (second > 0) {
    first %= second;
    swap(first, second);
  }
  return first;
}
template <class _T>
inline _T sqr(const _T &first) {
  return first * first;
}
template <class _T>
inline string tostr(const _T &a) {
  ostringstream os("");
  os << a;
  return os.str();
}
const long double PI = 3.1415926535897932384626433832795L;
template <typename T>
inline void input(T &a) {
  static int ed;
  a = 0;
  while (!isdigit(ed = getchar()) && ed != '-') {
  }
  char neg = 0;
  if (ed == '-') {
    neg = 1;
    ed = getchar();
  }
  while (isdigit(ed)) {
    a = 10 * a + ed - '0';
    ed = getchar();
  }
  if (neg) a = -a;
}
template <typename T = int>
inline T nxt() {
  T res;
  input(res);
  return res;
}
mt19937 generator;
long long mod = 1000000007;
long long mulmod(const long long &a, const long long &b) {
  long long ratio = (long double)a * b / mod;
  long long res = a * b - ratio * mod;
  while (res < 0) {
    res += mod;
  }
  while (res >= mod) {
    res -= mod;
  }
  return res;
}
long long addmod(const long long &a, const long long &b) {
  long long res = a + b;
  while (res >= mod) {
    res -= mod;
  }
  return res;
}
long long submod(const long long &a, const long long &b) {
  long long res = a - b;
  while (res < mod) {
    res += mod;
  }
  return res;
}
void fib(long long n, long long &first, long long &second) {
  if (n == 1) {
    first = 0, second = 1;
    return;
  }
  if (n & 1ull) {
    fib(n - 1, second, first);
    second = addmod(first, second);
  } else {
    long long a, b;
    fib(n / 2, a, b);
    long long u = mulmod(a, a);
    long long v = mulmod(a, b);
    long long w = mulmod(b, b);
    first = addmod(u, w);
    second = addmod(2 * v, w);
  }
}
long long pw(long long a, long long n) {
  long long res = 1;
  while (n) {
    if (n & 1ll) {
      res = mulmod(res, a);
    }
    a = mulmod(a, a);
    n >>= 1;
  }
  return res;
}
long long pw(long long a, long long n, long long m) {
  long long res = 1;
  while (n) {
    if (n & 1ll) {
      res = res * a % m;
    }
    a = a * a % m;
    n >>= 1;
  }
  return res;
}
const int V = 200000 * 5;
const int E = 200000 * 5;
int e = 1, he[V], ne[E], to[E];
int cc = 1, u[V], pa[V];
void add(int a, int b) { ne[e] = he[a], to[e] = b, he[a] = e++; }
int dfs(int v) {
  u[v] = cc;
  for (int first, e = he[v]; e; e = ne[e])
    if (pa[first = to[e]] == -1 || (u[pa[first]] != cc && dfs(pa[first]))) {
      pa[first] = v, pa[v] = first;
      return 1;
    }
  return 0;
}
int main() {
  int n = nxt();
  int m = nxt();
  set<pair<int, int> > TR;
  set<pair<int, int> > FA;
  vector<int> good[m];
  vector<int> bad[m];
  for (int i = 0; i < n; ++i) {
    int k = nxt();
    while (k--) {
      int u = nxt();
      if (u < 0) {
        FA.insert({i, -u - 1});
        bad[-u - 1].push_back(i);
      } else {
        TR.insert({i, u - 1});
        good[u - 1].push_back(i);
      }
      add(i, abs(u) - 1 + n);
    }
  }
  int ok[n];
  memset((ok), 0, sizeof(ok));
  int aa[m];
  memset(aa, 255, sizeof(aa));
  for (int i = 0; i < m; ++i) {
    if (good[i].empty()) {
      aa[i] = 0;
      for (int z : bad[i]) {
        ok[z] = 1;
      }
    }
    if (bad[i].empty()) {
      aa[i] = 1;
      for (int z : good[i]) {
        ok[z] = 1;
      }
    }
  }
  memset(pa, 255, sizeof(pa));
  int M = 0;
  for (int i = 0; i < n; ++i) {
    if (ok[i]) {
      ++M;
      continue;
    }
    if (pa[i] == -1) {
      for (int first, e = he[i]; e; e = ne[e])
        if (pa[first = to[e]] == -1) {
          pa[i] = first, pa[first] = i;
          M++;
          break;
        }
    }
  }
  for (int run = 1; run;) {
    run = 0, cc++;
    for (int i = 0; i < n; ++i) {
      if (ok[i]) continue;
      if (pa[i] == -1 && dfs(i)) M++, run = 1;
    }
  }
  if (M != n) {
    cout << "NO\n";
    return 0;
  }
  cout << "YES\n";
  string ans(m, '0');
  for (int i = 0; i < m; ++i) {
    if (aa[i] != -1) {
      ans[i] = (char)('0' + aa[i]);
      continue;
    }
    if (pa[n + i] == -1) {
      ans[i] = '0';
    } else {
      if (TR.count({pa[n + i], i})) {
        ans[i] = '1';
      } else {
        ans[i] = '0';
      }
    }
  }
  cout << ans << "\n";
  return 0;
}
