#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 100;
struct Edge {
  int u, v;
};
vector<Edge> edges;
vector<int> G[maxn];
int value[maxn];
vector<int> object[maxn];
vector<int> ans;
bool vis[maxn];
bool flag;
int n, m;
void AddEdge(int u, int v);
void dfs(int now);
int main() {
  int q, num;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) value[i] = i;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &q);
    for (int j = 0; j < q; j++) {
      scanf("%d", &num);
      object[i].push_back(num);
    }
  }
  for (int i = 1; i < n; i++) {
    int l = 0;
    while (l < object[i].size() && l < object[i + 1].size() &&
           object[i][l] == object[i + 1][l])
      l++;
    if (l == object[i].size() || l == object[i + 1].size()) {
      if (object[i].size() > object[i + 1].size()) {
        printf("No\n");
        return 0;
      }
      continue;
    }
    AddEdge(object[i + 1][l], object[i][l]);
  }
  flag = true;
  for (int i = 1; i <= m; i++) {
    if (!vis[i]) dfs(i);
  }
  if (flag) {
    printf("Yes\n");
    printf("%d\n", ans.size());
    for (int i = 0; i < ans.size(); i++) {
      if (i) printf(" ");
      printf("%d", ans[i]);
    }
    printf("\n");
  } else
    printf("No\n");
  return 0;
}
void AddEdge(int u, int v) {
  Edge temp;
  temp.u = u, temp.v = v;
  edges.push_back(temp);
  G[u].push_back(edges.size() - 1);
}
void dfs(int now) {
  vis[now] = true;
  for (int i = 0; i < G[now].size(); i++) {
    Edge temp = edges[G[now][i]];
    if (value[temp.v] > value[now]) {
      if (value[temp.v] <= 0) {
        flag = false;
        return;
      }
      value[temp.v] -= m;
      if (value[temp.v] > value[now]) {
        flag = false;
        return;
      }
      ans.push_back(temp.v);
      dfs(temp.v);
    }
  }
}
