#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
const int N = 210;
const int INF = 0x3f3f3f3f;
void MOD(long long &a) {
  if (a >= mod) a -= mod;
}
void MOD(long long &a, long long c) {
  if (a >= c) a -= c;
}
void ADD(long long &a, long long b) {
  a += b;
  MOD(a);
}
void ADD(long long &a, long long b, long long c) {
  a += b;
  MOD(a, c);
}
long long qpow(long long a, long long b) {
  long long ans = 1;
  while (b) {
    if (b & 1) ans = ans * a % mod;
    a = a * a % mod;
    b /= 2;
  }
  return ans;
}
long long qpow(long long a, long long b, long long c) {
  long long ans = 1;
  while (b) {
    if (b & 1) ans = ans * a % c;
    a = a * a % c;
    b /= 2;
  }
  return ans;
}
int head[N], tot, n, m, in[N], out[N], tl[N], cnt;
multiset<pair<int, int> > mp, ad;
queue<int> q;
vector<pair<int, int> > ans;
bool did[N];
struct EDGE {
  int to, nex;
} e[50010];
void add(int u, int v) {
  e[tot].to = v;
  e[tot].nex = head[u];
  head[u] = tot++;
}
void init() {
  tot = 1;
  memset(head, -1, sizeof(head));
  mp.clear();
  memset(in, 0, sizeof(in));
  memset(out, 0, sizeof(out));
  memset(tl, 0, sizeof(tl));
  ans.clear();
  cnt = 0;
  memset(did, false, sizeof(did));
}
void dfs(int now) {
  for (int i = head[now]; i != -1; i = e[i].nex) {
    int x = e[i].to;
    if (mp.find({min(x, now), max(x, now)}) != mp.end()) {
      mp.erase(mp.lower_bound({min(x, now), max(x, now)}));
      dfs(x);
    }
  }
  did[now] = true;
  q.push(now);
}
int main() {
  int T;
  scanf("%d", &T);
  while (T--) {
    scanf("%d%d", &n, &m);
    init();
    for (int i = 0, u, v; i < m; i++) {
      scanf("%d%d", &u, &v);
      tl[u]++;
      tl[v]++;
      add(u, v);
      add(v, u);
      mp.insert({min(u, v), max(u, v)});
      ad.insert({min(u, v), max(u, v)});
    }
    for (int i = 1; i <= n; i++)
      if (tl[i] % 2 == 0) cnt++;
    int bef = -1;
    for (int i = 1; i <= n; i++) {
      if (tl[i] % 2) {
        if (bef == -1)
          bef = i;
        else {
          mp.insert({min(bef, i), max(bef, i)});
          add(i, bef);
          add(bef, i);
          bef = -1;
        }
      }
    }
    for (int i = 1; i <= n; i++) {
      if (!did[i] && tl[i]) {
        dfs(i);
        bef = q.front();
        q.pop();
        while (!q.empty()) {
          if (ad.find({min(bef, q.front()), max(q.front(), bef)}) != ad.end()) {
            ans.push_back({bef, q.front()});
            ad.erase(
                ad.lower_bound({min(bef, q.front()), max(q.front(), bef)}));
          }
          bef = q.front();
          q.pop();
        }
      }
    }
    printf("%d\n", cnt);
    for (int i = 0; i < ((int)ans.size()); i++)
      printf("%d %d\n", ans[i].first, ans[i].second);
  }
}
