#include <bits/stdc++.h>
using namespace std;
int N, M;
int head[200005];
int di[200005];
struct way {
  int f, t, nxt;
  bool rev = 0;
  bool flg = 0;
} e[400005];
int ei = 1;
void add_edge(int f, int t) {
  e[++ei].f = f;
  e[ei].t = t;
  e[ei].nxt = head[f];
  head[f] = ei;
}
void init() {
  for (int i = 1; i <= N + 1; i++) di[i] = head[i] = 0;
  for (int i = 1; i <= ei; i++) {
    e[i].f = e[i].nxt = e[i].t = e[i].flg = e[i].rev = 0;
  }
  ei = 1;
}
void dfs(int x) {
  for (int i = head[x]; i; i = e[i].nxt) {
    if (!e[i].flg) {
      e[i].flg = 1;
      e[i ^ 1].flg = 1;
      e[i].rev = 1;
      dfs(e[i].t);
    }
  }
}
int ans = 0;
int main() {
  int T;
  cin >> T;
  while (T--) {
    ans = 0;
    scanf("%d %d", &N, &M);
    for (int i = 1; i <= M; i++) {
      int u, v;
      scanf("%d %d", &u, &v);
      ++di[u], ++di[v];
      add_edge(u, v);
      add_edge(v, u);
    }
    for (int i = 1; i <= N; i++) {
      if (di[i] % 2) {
        add_edge(N + 1, i);
        add_edge(i, N + 1);
      } else
        ++ans;
    }
    for (int i = 1; i <= N + 1; i++) dfs(i);
    cout << ans << endl;
    for (int i = 2; i <= ei; i++) {
      if (e[i].f <= N && e[i].t <= N && e[i].rev) {
        printf("%d %d\n", e[i].f, e[i].t);
      }
    }
    init();
  }
  return 0;
}
