#include <bits/stdc++.h>
using namespace std;
int n, m;
int info[2000006], Prev[2000006], to[2000006], cnt_e;
void Node(int u, int v) {
  Prev[++cnt_e] = info[u], info[u] = cnt_e, to[cnt_e] = v;
}
int dfn[2000006], low[2000006], c[2000006], q[2000006], L, R, scc, tot;
void dfs(int u) {
  dfn[u] = low[u] = ++tot;
  q[R++] = u;
  for (int i = info[u], v; i; i = Prev[i])
    if (!dfn[v = to[i]])
      dfs(v), low[u] = min(low[u], low[v]);
    else if (!c[v])
      low[u] = min(low[u], dfn[v]);
  if (low[u] == dfn[u]) {
    scc++;
    for (int t = -1; t != u;) c[t = q[--R]] = scc;
  }
}
vector<int> a1, a2;
int main() {
  int T;
  for (scanf("%d", &T); T--;) {
    scanf("%d%d", &n, &m);
    for (int i = 1, u, v; i <= m; i++) {
      scanf("%d%d", &u, &v);
      if (u != v) Node(u, v + n);
    }
    for (int i = 1; i <= n; i++) Node(i + n, i);
    for (int i = 1; i <= n; i++)
      if (!dfn[i]) dfs(i);
    if (scc == 1)
      puts("No");
    else {
      puts("Yes");
      a1.clear(), a2.clear();
      for (int i = 1; i <= n; i++) {
        if (c[i] == 1)
          a1.push_back(i);
        else
          a2.push_back(i);
      }
      printf("%d %d\n", a1.size(), a2.size());
      for (int i = 0; i < a1.size(); i++)
        printf("%d%c", a1[i], " \n"[i == a1.size() - 1]);
      for (int i = 0; i < a2.size(); i++)
        printf("%d%c", a2[i], " \n"[i == a2.size() - 1]);
    }
    for (int i = 1; i <= 2 * n; i++) info[i] = dfn[i] = low[i] = c[i] = 0;
    scc = tot = L = R = cnt_e = 0;
  }
}
