#include <bits/stdc++.h>
using namespace std;
int n;
int m;
vector<int> v[402];
bool flag[402];
set<pair<int, int> > used;
vector<int> path;
inline void dfs(int b) {
  while (v[b].size()) {
    int cur = v[b].back();
    v[b].pop_back();
    if (used.count(make_pair(cur, b))) {
      continue;
    }
    used.insert(make_pair(b, cur));
    dfs(cur);
  }
  path.push_back(b);
}
set<pair<int, int> > considered;
int belong[402];
inline int root(int b) {
  if (belong[b] == -1) {
    return b;
  }
  belong[b] = root(belong[b]);
  return belong[b];
}
void merge(int a, int b) {
  a = root(a);
  b = root(b);
  if (a == b) return;
  belong[a] = b;
}
int main() {
  int t;
  cin >> t;
  while (t--) {
    memset(belong, -1, sizeof(belong));
    considered.clear();
    used.clear();
    for (int i = 0; i < 402; i++) {
      v[i].clear();
    }
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; i++) {
      int a, b;
      scanf("%d%d", &a, &b);
      a--;
      b--;
      v[a].push_back(b);
      v[b].push_back(a);
      merge(a, b);
    }
    int P = n;
    int ans = 0;
    for (int i = 0; i < n; i++) {
      if (v[i].size() % 2 == 0) {
        ans++;
      } else {
        v[P + root(i)].push_back(i);
        v[i].push_back(P + root(i));
      }
    }
    for (int i = 0; i < 402; i++) {
      if (v[i].size() % 2) {
        path.clear();
        dfs(i);
        reverse(path.begin(), path.end());
        for (int i = 0; i + 1 < path.size(); i++) {
          considered.insert(make_pair(path[i], path[i + 1]));
        }
      }
    }
    for (int i = 0; i < 402; i++) {
      path.clear();
      dfs(i);
      reverse(path.begin(), path.end());
      for (int i = 0; i + 1 < path.size(); i++) {
        considered.insert(make_pair(path[i], path[i + 1]));
      }
    }
    printf("%d\n", ans);
    for (auto it = considered.begin(); it != considered.end(); it++) {
      if ((*it).first >= P || (*it).second >= P) continue;
      printf("%d %d\n", (*it).first + 1, (*it).second + 1);
    }
  }
  return 0;
}
