#include <bits/stdc++.h>
using namespace std;
const int INF = 1e7;
void find_euler(int v, vector<vector<pair<int, int> > > &g,
                vector<int> &is_delete, stack<int> &euler, vector<int> &used) {
  used[v] = true;
  while (!g[v].empty()) {
    int to = g[v].back().first;
    int id = g[v].back().second;
    if (is_delete[id]) {
      g[v].pop_back();
    } else {
      is_delete[id] = 1;
      g[v].pop_back();
      find_euler(to, g, is_delete, euler, used);
    }
  }
  euler.push(v);
}
int main() {
  int t;
  cin >> t;
  for (int w = 0; w < t; w++) {
    int n, m;
    cin >> n >> m;
    vector<vector<pair<int, int> > > g(n);
    vector<int> deg(n, 0);
    for (int i = 0; i < m; i++) {
      int u, v;
      cin >> u >> v;
      u--;
      v--;
      g[u].push_back({v, i});
      deg[u]++;
      g[v].push_back({u, i});
      deg[v]++;
    }
    vector<int> odd_degree;
    for (int i = 0; i < n; i++) {
      if (deg[i] % 2 == 1) odd_degree.push_back(i);
    }
    map<pair<int, int>, int> odd_edges;
    for (int i = 0; i < odd_degree.size() / 2; i += 1) {
      int u = odd_degree[i * 2];
      int v = odd_degree[i * 2 + 1];
      g[u].push_back({v, m + i});
      g[v].push_back({u, m + i});
      odd_edges[{u, v}] = 1;
      odd_edges[{v, u}] = 1;
    }
    vector<int> is_delete(m + odd_degree.size() / 2, 0);
    vector<stack<int> > all_euler;
    vector<int> used(n, 0);
    for (int i = 0; i < n; i++) {
      stack<int> euler;
      if (!used[i]) {
        find_euler(i, g, is_delete, euler, used);
        if (euler.size() > 1) all_euler.push_back(euler);
      }
    }
    vector<vector<int> > g1(n);
    for (int i = 0; i < all_euler.size(); i++) {
      stack<int> euler = all_euler[i];
      int prev = euler.top();
      euler.pop();
      int v;
      while (!euler.empty()) {
        v = euler.top();
        euler.pop();
        g1[prev].push_back(v);
        prev = v;
      }
    }
    cout << n - odd_degree.size() << endl;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < g1[i].size(); j++) {
        int v = i;
        int u = g1[i][j];
        if (!odd_edges[{u, v}] && !odd_edges[{v, u}]) {
          cout << v + 1 << " " << u + 1 << endl;
        } else
          odd_edges[{u, v}] = odd_edges[{v, u}] = 0;
      }
    }
  }
  return 0;
}
