#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
const long long MOD = 998244353;
const long long inf = 1e18;
const long long MAX = 2e5 + 1;
inline long long add(long long a, long long b) {
  return ((a % mod) + (b % mod)) % mod;
}
inline long long sub(long long a, long long b) {
  return ((a % mod) - (b % mod) + mod) % mod;
}
inline long long mul(long long a, long long b) {
  return ((a % mod) * (b % mod)) % mod;
}
long long pwr(long long x, long long n) {
  x = x % mod;
  if (!n) return 1;
  if (n & 1)
    return mul(x, pwr(mul(x, x), (n - 1) / 2));
  else
    return pwr(mul(x, x), n / 2);
}
long long modinv(long long n) { return pwr(n, mod - 2); }
long long inv(long long i) {
  if (i == 1) return 1;
  return (MOD - (MOD / i) * inv(MOD % i) % MOD) % MOD;
}
bool f(int a, int b) { return a > b; }
struct cmp {
  bool operator()(const int& k1, const int& k2) { return k1 > k2; }
};
vector<int> ans;
void dfs(vector<vector<int>>& graph, vector<int>& vis, int node) {
  vis[node] = 1;
  for (int child : graph[node]) {
    if (!vis[child]) dfs(graph, vis, child);
  }
  ans.push_back(node);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int tt = 1;
  cin >> tt;
  while (tt--) {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> graph(n);
    vector<pair<int, int>> edges;
    ans.clear();
    for (int i = 0; i < m; i++) {
      int t, x, y;
      cin >> t >> x >> y;
      x--;
      y--;
      edges.push_back({x, y});
      if (t) graph[x].push_back(y);
    }
    vector<int> vis(n, 0);
    for (int i = 0; i < n; i++) {
      if (!vis[i]) dfs(graph, vis, i);
    }
    vector<int> pos(n);
    for (int i = 0; i < n; i++) pos[ans[i]] = i;
    bool counter = false;
    for (int i = 0; i < n; i++) {
      for (int child : graph[i]) {
        if (pos[child] > pos[i]) {
          counter = true;
        }
      }
    }
    if (counter)
      cout << "NO\n";
    else {
      cout << "YES\n";
      for (auto p : edges) {
        int x = p.first, y = p.second;
        if (pos[x] > pos[y])
          cout << x + 1 << " " << y + 1 << "\n";
        else
          cout << y + 1 << " " << x + 1 << "\n";
      }
    }
  }
  return 0;
}
