#include <bits/stdc++.h>
using namespace std;
template <class T, class L>
inline bool smax(T &x, L y) {
  return x < y ? (x = y, 1) : 0;
}
template <class T, class L>
inline bool smin(T &x, L y) {
  return y < x ? (x = y, 1) : 0;
}
const int maxn = 2e2 + 17, maxm = maxn * maxn;
int from[maxm], to[maxm], n, m;
bool bl[maxm], mark[maxn];
vector<int> g[maxn], vec;
void see(int v) {
  if (mark[v]) return;
  mark[v] = 1;
  vec.push_back(v);
  for (auto i : g[v]) see(from[i] ^ to[i] ^ v);
}
void dfs(int v) {
  for (int i = g[v].size() - 1; i >= 0; i = (int)g[v].size() - 1) {
    int e = g[v][i], u = from[e] ^ to[e] ^ v;
    if (v != from[e]) swap(from[e], to[e]);
    g[v].pop_back();
    if (bl[e]) continue;
    bl[e] = 1;
    dfs(u);
  }
}
void solve() {
  cin >> n >> m;
  int cm = m, ans = 0;
  for (int i = 0; i < m; i++) {
    cin >> from[i] >> to[i], from[i]--, to[i]--;
    g[from[i]].push_back(i), g[to[i]].push_back(i);
  }
  for (int i = 0; i < n; i++) ans += g[i].size() % 2 == 0;
  for (int i = 0; i < n; i++)
    if (!mark[i]) {
      vec.clear();
      see(i);
      int last = -1;
      for (auto v : vec)
        if (g[v].size() & 1)
          if (last != -1)
            last = v;
          else {
            from[m] = v, to[m] = last;
            g[v].push_back(m), g[last].push_back(m);
            m++, last = -1;
          }
      dfs(i);
    }
  cout << ans << '\n';
  for (int i = 0; i < cm; i++) cout << from[i] + 1 << ' ' << to[i] + 1 << '\n';
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  int t;
  cin >> t;
  while (t--) {
    memset(mark, 0, sizeof mark);
    memset(bl, 0, sizeof bl);
    solve();
  }
  return 0;
}
