#include <bits/stdc++.h>
using namespace std;
int rd() {
  char c = getchar();
  int s = 0, f = 1;
  while (c > '9' || c < '0') {
    if (c == '-') f = -f;
    c = getchar();
  }
  while (c >= '0' && c <= '9')
    s = (s << 1) + (s << 3) + (c ^ 48), c = getchar();
  return s * f;
}
const int N = 4000005;
int head[N], nxt[N], to[N], idx, num, n, m;
int dfn[N], low[N], s[N], top, cnt, id[N];
int l1, l2, p[N], q[N], d[N];
bool vis[N];
void add(int x, int y) { to[++num] = y, nxt[num] = head[x], head[x] = num; }
void tarjan(int u) {
  dfn[u] = low[u] = ++idx, vis[u] = 1, s[++top] = u;
  for (int i = head[u]; i; i = nxt[i]) {
    if (!dfn[to[i]])
      tarjan(to[i]), low[u] = min(low[u], low[to[i]]);
    else if (vis[to[i]])
      low[u] = min(low[u], dfn[to[i]]);
  }
  if (low[u] == dfn[u]) {
    cnt++;
    do {
      vis[s[top]] = 0, id[s[top]] = cnt;
    } while (s[top--] != u);
  }
}
void print(int x) {
  if (cnt == 1) {
    puts("No");
    return;
  }
  l1 = l2 = 0;
  for (int i = 1; i <= n; i++)
    if (id[i] != x)
      p[++l1] = i;
    else
      q[++l2] = i;
  puts("Yes");
  printf("%d %d\n", l1, l2);
  for (int i = 1; i <= l1; i++) printf("%d ", p[i]);
  puts("");
  for (int i = 1; i <= l2; i++) printf("%d ", q[i]);
  puts("");
}
int main() {
  int T;
  scanf("%d", &T);
  while (T--) {
    cnt = top = num = idx = 0;
    for (int i = 0; i <= n + n; i++)
      dfn[i] = low[i] = head[i] = s[i] = id[i] = d[i] = vis[i] = 0;
    n = rd(), m = rd();
    for (int i = 1, x, y; i <= m; i++) x = rd(), y = rd(), add(x, y);
    for (int i = 1; i <= n; i++)
      if (!dfn[i]) tarjan(i);
    for (int i = 1; i <= n; i++)
      for (int j = head[i]; j; j = nxt[j])
        if (id[to[j]] != id[i]) d[id[to[j]]]++;
    for (int i = 1; i <= cnt; i++)
      if (d[i] == 0) {
        print(i);
        break;
      }
  }
  return 0;
}
