#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("sse4")
using namespace std;
const double PI = acos(-1.0);
using namespace std;
struct Condense_graph_SCC {
  long long n;
  vector<vector<long long>> adj;
  vector<vector<long long>> adjtranspose;
  vector<bool> visited1;
  vector<bool> visited2;
  stack<long long> st;
  vector<long long> color;
  vector<vector<long long>> SCC;
  long long c = 0;
  void init(long long r) {
    n = r;
    adj.resize(r + 5);
    adjtranspose.resize(r + 5);
    visited1.resize(r + 5, false);
    visited2.resize(r + 5, false);
    color.resize(r + 5, -1);
    c = 0;
  }
  void add_edge(long long u, long long v) {
    adj[u].push_back(v);
    adjtranspose[v].push_back(u);
  }
  void dfs1(long long node) {
    visited1[node] = true;
    for (auto x : adj[node]) {
      if (!visited1[x]) {
        dfs1(x);
      }
    }
    st.push(node);
  }
  void dfs2(long long node, long long c) {
    visited2[node] = true;
    color[node] = c;
    for (auto x : adjtranspose[node]) {
      if (!visited2[x]) {
        dfs2(x, c);
      }
    }
  }
  void condense_directed_graph() {
    for (long long i = 1; i <= n; i++) {
      if (!visited1[i]) {
        dfs1(i);
      }
    }
    while (!st.empty()) {
      long long x = st.top();
      st.pop();
      if (!visited2[x]) {
        dfs2(x, c++);
      }
    }
    SCC.resize(c);
    for (long long i = 1; i <= n; i++) {
      for (auto x : adj[i]) {
        if (color[i] != color[x]) {
          SCC[color[i]].push_back(color[x]);
        }
      }
    }
  }
};
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  long long t;
  cin >> t;
  while (t--) {
    long long n, m;
    cin >> n >> m;
    Condense_graph_SCC sc;
    sc.init(n);
    for (long long i = 1; i <= m; i++) {
      long long u, v;
      cin >> u >> v;
      if (u == v) {
        continue;
      }
      sc.add_edge(u, v);
    }
    sc.condense_directed_graph();
    if (sc.c == 1) {
      cout << "No\n";
      continue;
    }
    long long col;
    for (long long i = 0; i < sc.c; i++) {
      if (sc.SCC[i].size() == 0) {
        col = i;
        break;
      }
    }
    vector<long long> p, q;
    for (long long i = 1; i <= n; i++) {
      if (sc.color[i] == col) {
        p.push_back(i);
      } else {
        q.push_back(i);
      }
    }
    cout << "Yes\n";
    cout << p.size() << " " << q.size() << "\n";
    for (auto x : p) {
      cout << x << " ";
    }
    cout << "\n";
    for (auto x : q) {
      cout << x << " ";
    }
    cout << "\n";
  }
}
