#include <bits/stdc++.h>
using namespace std;
const int N = (int)2e2 + 11;
int n, m;
pair<int, int> ans[N * N];
vector<int> ord;
vector<pair<int, int> > g[N];
bool u[N], used[N * N + N];
void dfs(int v) {
  u[v] = 1;
  for (int i = 0; i < g[v].size(); i++) {
    int to = g[v][i].first;
    if (!u[to]) dfs(to);
  }
  if (g[v].size() % 2) ord.push_back(v);
}
void dfsEiler(int v) {
  while (!g[v].empty()) {
    pair<int, int> to = g[v].back();
    g[v].pop_back();
    if (used[to.second]) continue;
    used[to.second] = 1;
    if (to.second <= m) ans[to.second] = make_pair(v, to.first);
    dfsEiler(to.first);
  }
}
void solve() {
  memset(u, 0, sizeof(u));
  memset(used, 0, sizeof(used));
  for (int i = 1; i < N; i++) g[i].clear();
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int x, y;
    cin >> x >> y;
    g[x].push_back({y, i});
    g[y].push_back({x, i});
  }
  int q = m;
  for (int i = 1; i <= n; i++)
    if (!u[i]) {
      ord.clear();
      dfs(i);
      int j = 0;
      while (j < ord.size()) {
        q++;
        int x = ord[j];
        j++;
        int y = ord[j];
        j++;
        g[x].push_back({y, q});
        g[y].push_back({x, q});
      }
    }
  memset(u, 0, sizeof(u));
  for (int i = 1; i <= n; i++)
    if (!u[i]) {
      dfsEiler(i);
    }
  cout << n - (q - m) * 2 << "\n";
  for (int i = 1; i <= m; i++)
    cout << ans[i].first << " " << ans[i].second << "\n";
}
int main() {
  ;
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  int tt = 1;
  cin >> tt;
  while (tt--) {
    solve();
  }
  return 0;
}
